{"id":23080,"date":"2026-10-09T14:06:23","date_gmt":"2026-10-09T12:06:23","guid":{"rendered":"https:\/\/staging.transparentedge.eu\/?p=23080"},"modified":"2026-10-09T14:10:38","modified_gmt":"2026-10-09T12:10:38","slug":"agentic-and-human-friendly-te-api","status":"publish","type":"post","link":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/","title":{"rendered":"te-api: an agentic and human-friendly CLI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">There is a question we didn&#8217;t ask ourselves a year ago and that now shows up in every tool we touch: can an agent use this? Not a developer with the documentation open, but a model that receives a task, decides which command to run, reads what comes back, and keeps going. At Transparent Edge we have a command-line tool, <strong>te-api<\/strong>, that wraps our entire API. It worked well for people. For an agent, it was a minefield. Today we share what we have changed, what we focused on, and what you can do with it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Cloudflare taught us<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A few days ago Cloudflare launched <a href=\"https:\/\/blog.cloudflare.com\/cloudflare-cf-cli-launch\/\">cf<\/a>, its new CLI, and it did so with a phrase that stuck with us: they built it \u201cfrom scratch with agents in mind\u201d. It is not a tool for people to which a &#8211;json flag is added later. It works the other way around.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">From the post, we care less about the Workers and TypeScript configuration parts, which do not apply to our case, and much more about three ideas on how a CLI should behave when the one invoking it is a model:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>JSON by default.<\/strong> In their words, \u201cpretty printed for humans and condensed for agents, to save as much context as possible\u201d. The format is decided by whoever is on the other end, instead of an option you never remember to set.<\/li>\n\n\n\n<li><strong>Built-in discovery.<\/strong> With more than 3,000 operations, an agent cannot read the help for all of them. So <code>cf cli search<\/code> takes a question in natural language and returns candidate commands based on the API description and its parameters. And the tool itself tells the agent about this the first time it asks for <code>--help<\/code>.<\/li>\n\n\n\n<li><strong>A guide for the agent, not for the developer.<\/strong> An AGENTS.md file (thanks, Claude, for finally sticking to the standard) that explains how to use the tool, not how to contribute to it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">What struck us most is that all of this is generated from the OpenAPI schema, the same one that feeds their documentation and their SDKs. And we smiled a little, because te-api has been doing exactly that for a while. Thanks <a href=\"https:\/\/en.wikipedia.org\/wiki\/Peter_Steinberger_(programmer)\">Peter Steinberger<\/a> for showing us the way \ud83d\ude42<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Where we started<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>te-api<\/strong> is a CLI developed in Python that generates itself from the OpenAPI schema served by our API. The first time you run it, it downloads the schema with your credentials (in your <em>.env<\/em>) and builds one command for each operation you have access to: more than 350 in the full version. When the API changes, the tool detects it and regenerates. Nobody should maintain a list of commands by hand, so we have tried to keep it as easy and maintainable as possible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The structure was already one an agent appreciates: <code>te-api &lt;module&gt; &lt;verb&gt; &lt;resource&gt;<\/code>, with verbs normalized to <code>get, create, update and delete<\/code>, and a <strong>te-api-ro<\/strong> variant that only exposes reads, for when you prefer that an agent cannot break anything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problem was in what it printed to the screen. The tool was speaking to a person sitting in front of a terminal:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If a call failed, it printed Error: &#8230; to stdout and exited with code 0. For a script, that is a success. For an agent, it is text it has to interpret, and where it is easy to get it wrong.<\/li>\n\n\n\n<li>All JSON came out indented, always. Comfortable to read, expensive in tokens when the response is thousands of lines.<\/li>\n\n\n\n<li>The commands that send data had a &#8211;json-body option whose help said, literally, \u201cJSON string for request body\u201d. The schema for that body was in the OpenAPI, unused. The agent knew it had to send something, but not what. It is worth noting that this was not exactly friendly to people either, so it needed fixing.<\/li>\n\n\n\n<li>To find a command you had to browse &#8211;help level by level. With 350 commands, that means many calls and a lot of context spent before doing anything useful.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">None of this was a design mistake when it was written. The user we had in mind was simply a different one.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">An output contract a machine can read<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first thing we did was the least flashy and the most important: define, in one single place, what goes where and what each exit code means. Before, each of the 350 generated commands carried its own copy of the block that made the request and printed the result. Now they all delegate to a common module, and the contract is this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>stdout<\/code><\/strong> <strong>carries the API response and nothing else.<\/strong> If <code>stdout<\/code> is a terminal, the JSON comes out indented. If it is a pipe, it comes out compact. It is the same idea Cloudflare describes: whoever is listening decides the format. <code>--output pretty|compact <\/code>forces one or the other when needed.<\/li>\n\n\n\n<li><strong>Errors are a JSON object in<\/strong> <strong><code>stderr<\/code><\/strong>, with the type of failure, the HTTP status, the URL and the body the API returned.<\/li>\n\n\n\n<li><strong>The exit code tells apart the type of failure<\/strong>: 0 all good, 1 the API responded with an error, 2 the command line was wrong, 3 the API could not be reached or the token could not be obtained.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, a failed call looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ te-api inventory get node 999999999\n{\"error\":{\"type\":\"api\",\"message\":\"HTTP 404 Not Found\",\"status\":404,\"url\":\"https:\/\/api.transparentcdn.com\/v1\/inventory\/node\/999999999\/\",\"body\":{\"code\":\"not_found\",\"message\":\"Not found.\"}}}\n$ echo $?\n1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And a successful one, piped into jq, keeps only what matters:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ te-api companies get current-user | jq .id\n10\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It may seem like a small thing. But an agent that can rely on the exit code and parse <code>stderr<\/code> does not need to guess anything, and one that receives compact JSON spends half the context on every response. Everything else rests on this.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Making sure the agent knows what to send<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The second change targets the \u201c<code>JSON string for request body<\/code>\u201d. The schema for each request body was in the OpenAPI, almost always behind a reference to a shared component. The generator now resolves those references, flattens the compositions (<code>allOf, oneOf)<\/code>, and builds the help from the actual schema: each property with its type, whether it is required, and its description. Properties the API marks as read-only are omitted, because they are received and never sent.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ te-api companies create alerts --help\n  --json-body TEXT   JSON request body. JSON object with keys:\n                     threshold(integer &#91;required])   company(integer &#91;required])\n                     service(integer)   active(boolean)\n                     reactions(array of object &#91;required])\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">In addition to <code>--json-body<\/code>, all those commands now accept <code>--body-file<\/code>, with &#8211; to read from standard input. Writing JSON on a command line is an endless source of quoting errors, and an agent that builds the command programmatically makes them just as easily as a person, or more. With a file, there is nothing to escape. And if the JSON arrives broken, by whatever route, the tool reports it as a usage error, with code 2, instead of dumping a Python traceback.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Finding the command without reading 350 help pages<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here we shamelessly copied the idea behind <code>cf cli search<\/code>, let&#8217;s be honest. Cloudflare has more than 3,000 operations and needs a search index. We have a tenth of that, and something much simpler is enough for us.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, alongside the commands, the generator writes a <em>catalog.json<\/em> with one entry per command: name, summary, HTTP method, path, each parameter with its type, whether it is required and its possible values, and the body schema if it has one. On top of that catalog there are two new commands:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ te-api search waf events --limit 2\n&#91;{\"command\":\"statistics get waf\",\"summary\":\"WAF statistics\",\"method\":\"get\",\"path\":\"\/v2\/statistics\/{company_id}\/waf\/{temporality}\/{request_type}\/\",\"score\":3.0},\n {\"command\":\"statistics get waf-header-info\",\"summary\":\"WAF header Details\",\"method\":\"get\",\"path\":\"\/v1\/statistics\/{company_id}\/waf\/header_info\/{waf_header_id}\/\",\"score\":3.0}]\n\n\n$ te-api describe statistics get waf\n{\"command\":\"statistics get waf\",\"method\":\"get\",\"path\":\"\/v2\/statistics\/{company_id}\/waf\/{temporality}\/{request_type}\/\",\"parameters\":&#91;{\"name\":\"temporality\",\"in\":\"path\",\"argument\":true,\"required\":true,\"choices\":&#91;\"historic\",\"analytic\"]}, ...\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u279c <code>search<\/code><\/strong> scores by word overlap between your question and the command name, its summary, its description and the names of its parameters. The name weighs more than the summary, and the summary more than the rest. There are no embeddings and no dependencies, and at this size it works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u279c <code>describe<\/code><\/strong> is, in fact, the piece we like most. It returns the full definition of a command as JSON, which is exactly what an agent needs to build a correct call on the first try. It is the equivalent of a tool definition in an MCP server, but covering all of the API and without deploying anything. And if you give it only a prefix, <code>te-api describe billing get<\/code>, it lists what is underneath.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The guide lives inside the binary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cloudflare mentions an AGENTS.md that comes with the tool. We already had one, but it was for whoever develops te-api, not for whoever uses it. So we added a command, <strong><code>te-api agents<\/code><\/strong>, which prints a short guide designed for whoever is going to drive the tool unsupervised: the shape of the commands, how to find them, the output contract and error codes, how to set the company you are working on with an environment variable instead of touching shared state, and how authentication works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The guide lives inside the binary for a practical reason: that way it always describes the version you have installed, not the one that existed when someone documented it. And with <code>--skill<\/code> it is wrapped in the header that Claude Code expects, so installing it as a skill takes one line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/.claude\/skills\/te-api\nte-api agents --skill &gt; ~\/.claude\/skills\/te-api\/SKILL.md<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><br>We also copied the detail that the tool introduces itself. The root <code>--help<\/code> now says, in three lines, that <code>search, describe and agents<\/code> exist, and that responses are JSON on <code>stdout<\/code> and errors are JSON on <code>stderr<\/code>. It is the only help an agent reads reliably, so that is where it has to be.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What we deliberately did not do<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It would be easy to read Cloudflare&#8217;s post and want to replicate it in full, but we chose to give it our own practical touch and adopt what is most useful.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u279c<\/strong> <strong>There is no semantic search.<\/strong> With 350 commands, word search solves most cases, and when it fails, the full list of commands fits in the context of any current model. Adding embeddings for this would mean adding a dependency and a source of errors to gain very little. If the API someday triples in size, we will review it. Problem for tomorrow&#8217;s team.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u279c<\/strong> <strong>There is no typed configuration.<\/strong> The part of the post dedicated to <em>cloudflare.config.ts<\/em> solves a Workers deployment problem that we do not have. The only thing <strong>te-api<\/strong> needs to know is which company you are working with, and that is solved with an environment variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u279c<\/strong> <strong>We have not changed the command names.<\/strong> They come from the OpenAPI schema, and agents handle them without trouble. Changing them now would break the scripts that already use them, all for an aesthetic gain that only people with OCD would appreciate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The rule we followed was simple: every change had to eliminate a specific way in which an agent could go wrong when using the tool. If there was none, it did not make the cut.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Try it<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>te-api<\/strong> is open source, under the GPL-3.0 license, and is on <a href=\"https:\/\/github.com\/TransparentEdge\/te-api\">GitHub<\/a>. It is installed with <a href=\"https:\/\/github.com\/astral-sh\/uv\">uv<\/a> and needs your OAuth2 credentials for the Transparent Edge API:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>uv tool install git+https:\/\/github.com\/TransparentEdge\/te-api.git\nexport TRANSPARENT_CLIENT_ID=\"...\"\nexport TRANSPARENT_CLIENT_SECRET=\"...\"\nte-api agents<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The first run downloads your schema and generates the commands you have access to. From there, <code>te-api search<\/code> and <code>te-api describe<\/code> are the entry point, whether you are the one typing or an agent is.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If what you want is to give an agent access without the risk of it changing anything, install the same thing and use <code>te-api-ro<\/code>: the same tool, the same output contract, reads only.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And if you try it and find a way your agent keeps tripping up, open a ticket. It is exactly the kind of problem we want to hear about.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Author:<\/strong> Diego Su\u00e1rez, Technology Director at Transparent Edge<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<div data-wp-context=\"{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }\" data-wp-interactive=\"core\/accordion\" role=\"group\" class=\"wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow\">\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-1&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading has-icon has-icon-right\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-1-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-1\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Does this replace an MCP server?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-1\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-1-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">No, it complements it. An MCP server offers a curated set of tools with descriptions designed for the model, and it is the best option for the most common use cases. The CLI covers 100% of the API, including operations nobody thought to expose, and requires nothing to deploy or maintain: the OpenAPI schema is the only source. In practice, an agent with access to a terminal and to <strong>te-api<\/strong> describe can do anything the API allows.<br><\/p>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-2&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading has-icon has-icon-right\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-2-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-2\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">Does it work with any agent, or only with Claude Code?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-2\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-2-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">With any agent that can run terminal commands. The output contract, <code>search<\/code>, <code>describe<\/code> and the agent guide are independent of the model. The <code>--skill<\/code> option adds the header Claude Code expects because that is what we use ourselves, but the text of the guide works just as well as system instructions for any other agent.<br><\/p>\n<\/div>\n<\/div>\n\n\n\n<div data-wp-class--is-open=\"state.isOpen\" data-wp-context=\"{ &quot;id&quot;: &quot;accordion-item-3&quot;, &quot;openByDefault&quot;: false }\" data-wp-init=\"callbacks.initAccordionItems\" data-wp-on-window--hashchange=\"callbacks.hashChange\" class=\"wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow\">\n<h3 class=\"wp-block-accordion-heading has-icon has-icon-right\"><button aria-expanded=\"false\" aria-controls=\"accordion-item-3-panel\" data-wp-bind--aria-expanded=\"state.isOpen\" data-wp-on--click=\"actions.toggle\" id=\"accordion-item-3\" type=\"button\" class=\"wp-block-accordion-heading__toggle\"><span class=\"wp-block-accordion-heading__toggle-title\">What happens when the API changes?<\/span><span class=\"wp-block-accordion-heading__toggle-icon\" aria-hidden=\"true\">+<\/span><\/button><\/h3>\n\n\n\n<div aria-labelledby=\"accordion-item-3\" data-wp-bind--hidden=\"state.isHidden\" data-wp-on--beforematch=\"actions.handleBeforeMatch\" id=\"accordion-item-3-panel\" role=\"region\" class=\"wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Nothing you need to do. The commands and the catalog are generated from the schema the API itself serves, and the tool detects when what it has generated does not match the installed version. If you prefer to force it, <code>te-api build<\/code> regenerates everything in a few seconds.<br><\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p>There is a question we didn&#8217;t ask ourselves a year ago and that now shows up in every tool we [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":22810,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[7],"tags":[],"class_list":["post-23080","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>te-api: an agentic and human-friendly CLI - Transparent Edge<\/title>\n<meta name=\"description\" content=\"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"te-api: an agentic and human-friendly CLI - Transparent Edge\" \/>\n<meta property=\"og:description\" content=\"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Transparent Edge\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-09T12:06:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-09T12:10:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2063\" \/>\n\t<meta property=\"og:image:height\" content=\"1377\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Diego Suarez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@tedgeservices\" \/>\n<meta name=\"twitter:site\" content=\"@tedgeservices\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/\"},\"author\":{\"name\":\"Diego Suarez\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#\\\/schema\\\/person\\\/6537f112583ca48864054e400e01af18\"},\"headline\":\"te-api: an agentic and human-friendly CLI\",\"datePublished\":\"2026-10-09T12:06:23+00:00\",\"dateModified\":\"2026-10-09T12:10:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/\"},\"wordCount\":2011,\"publisher\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/TE_blog_Living_on_the-_edge.jpg\",\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/\",\"url\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/\",\"name\":\"te-api: an agentic and human-friendly CLI - Transparent Edge\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/TE_blog_Living_on_the-_edge.jpg\",\"datePublished\":\"2026-10-09T12:06:23+00:00\",\"dateModified\":\"2026-10-09T12:10:38+00:00\",\"description\":\"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/TE_blog_Living_on_the-_edge.jpg\",\"contentUrl\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/TE_blog_Living_on_the-_edge.jpg\",\"width\":2063,\"height\":1377},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/blog\\\/agentic-and-human-friendly-te-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"te-api: an agentic and human-friendly CLI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/\",\"name\":\"Transparent Edge\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#organization\"},\"alternateName\":\"Transparent Edge\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#organization\",\"name\":\"Transparent Edge Services\",\"alternateName\":\"Transparent Edge\",\"url\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logotipo-cuadrado.jpg\",\"contentUrl\":\"https:\\\/\\\/staging.transparentedge.eu\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logotipo-cuadrado.jpg\",\"width\":1328,\"height\":1180,\"caption\":\"Transparent Edge Services\"},\"image\":{\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/tedgeservices\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/transparent-edge\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC5zZoyZmiLGBTAdiFpj2xHA\\\/videos\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/staging.transparentedge.eu\\\/en\\\/#\\\/schema\\\/person\\\/6537f112583ca48864054e400e01af18\",\"name\":\"Diego Suarez\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/diegosuarezgarcia\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"te-api: an agentic and human-friendly CLI - Transparent Edge","description":"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/","og_locale":"en_US","og_type":"article","og_title":"te-api: an agentic and human-friendly CLI - Transparent Edge","og_description":"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.","og_url":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/","og_site_name":"Transparent Edge","article_published_time":"2026-10-09T12:06:23+00:00","article_modified_time":"2026-10-09T12:10:38+00:00","og_image":[{"width":2063,"height":1377,"url":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg","type":"image\/jpeg"}],"author":"Diego Suarez","twitter_card":"summary_large_image","twitter_creator":"@tedgeservices","twitter_site":"@tedgeservices","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#article","isPartOf":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/"},"author":{"name":"Diego Suarez","@id":"https:\/\/staging.transparentedge.eu\/en\/#\/schema\/person\/6537f112583ca48864054e400e01af18"},"headline":"te-api: an agentic and human-friendly CLI","datePublished":"2026-10-09T12:06:23+00:00","dateModified":"2026-10-09T12:10:38+00:00","mainEntityOfPage":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/"},"wordCount":2011,"publisher":{"@id":"https:\/\/staging.transparentedge.eu\/en\/#organization"},"image":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#primaryimage"},"thumbnailUrl":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg","inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/","url":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/","name":"te-api: an agentic and human-friendly CLI - Transparent Edge","isPartOf":{"@id":"https:\/\/staging.transparentedge.eu\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#primaryimage"},"image":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#primaryimage"},"thumbnailUrl":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg","datePublished":"2026-10-09T12:06:23+00:00","dateModified":"2026-10-09T12:10:38+00:00","description":"New possibilities for using te-api. The Transparent Edge CLI is now optimized for both agents and people.","breadcrumb":{"@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#primaryimage","url":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg","contentUrl":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2026\/03\/TE_blog_Living_on_the-_edge.jpg","width":2063,"height":1377},{"@type":"BreadcrumbList","@id":"https:\/\/staging.transparentedge.eu\/en\/blog\/agentic-and-human-friendly-te-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/staging.transparentedge.eu\/en\/"},{"@type":"ListItem","position":2,"name":"te-api: an agentic and human-friendly CLI"}]},{"@type":"WebSite","@id":"https:\/\/staging.transparentedge.eu\/en\/#website","url":"https:\/\/staging.transparentedge.eu\/en\/","name":"Transparent Edge","description":"","publisher":{"@id":"https:\/\/staging.transparentedge.eu\/en\/#organization"},"alternateName":"Transparent Edge","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/staging.transparentedge.eu\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/staging.transparentedge.eu\/en\/#organization","name":"Transparent Edge Services","alternateName":"Transparent Edge","url":"https:\/\/staging.transparentedge.eu\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/staging.transparentedge.eu\/en\/#\/schema\/logo\/image\/","url":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2023\/07\/logotipo-cuadrado.jpg","contentUrl":"https:\/\/staging.transparentedge.eu\/wp-content\/uploads\/2023\/07\/logotipo-cuadrado.jpg","width":1328,"height":1180,"caption":"Transparent Edge Services"},"image":{"@id":"https:\/\/staging.transparentedge.eu\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/tedgeservices","https:\/\/www.linkedin.com\/company\/transparent-edge\/","https:\/\/www.youtube.com\/channel\/UC5zZoyZmiLGBTAdiFpj2xHA\/videos"]},{"@type":"Person","@id":"https:\/\/staging.transparentedge.eu\/en\/#\/schema\/person\/6537f112583ca48864054e400e01af18","name":"Diego Suarez","sameAs":["https:\/\/www.linkedin.com\/in\/diegosuarezgarcia\/"]}]}},"_links":{"self":[{"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/posts\/23080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/comments?post=23080"}],"version-history":[{"count":3,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/posts\/23080\/revisions"}],"predecessor-version":[{"id":23083,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/posts\/23080\/revisions\/23083"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/media\/22810"}],"wp:attachment":[{"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/media?parent=23080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/categories?post=23080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/staging.transparentedge.eu\/en\/wp-json\/wp\/v2\/tags?post=23080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}