[{"data":1,"prerenderedAt":74},["ShallowReactive",2],{"help-article-programmatic-read-write":3},{"data":4},{"title":5,"excerpt":6,"content":7,"help_category":8,"seo":11},"Programmatic Read & Write","What an AI agent can read and write in m18t over MCP today: content, artifacts, PD entities, and events, with brand scoping, search-before-create, and no","\u003Cp>\u003Cstrong>What you&#39;ll learn\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>What an AI agent can actually read and write in m18t over MCP today.\u003C\u002Fli>\n\u003Cli>The discipline the surface enforces: brand scoping, search-before-create, no delete.\u003C\u002Fli>\n\u003Cli>Where the surface stops, so you don&#39;t plan around tools that don&#39;t exist.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>The concept\u003C\u002Fh2>\n\u003Cp>Once you&#39;ve \u003Ca href=\"\u002Fhelp\u002Fconnecting-mcp-clients\">connected an MCP client\u003C\u002Fa>, your agent has a typed set of tools that map to your m18t records. They come in four shapes, and the naming is consistent across every entity:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>list_*\u003C\u002Fcode> — find records, with a \u003Ccode>query\u003C\u002Fcode> argument to search. Returns metadata only (titles, slugs, ids, status), not full bodies.\u003C\u002Fli>\n\u003Cli>\u003Ccode>read_*\u003C\u002Fcode> — fetch one record&#39;s full body by id (the artifact&#39;s document, the content&#39;s body, an email template&#39;s HTML, a feed item&#39;s raw data).\u003C\u002Fli>\n\u003Cli>\u003Ccode>create_*\u003C\u002Fcode> — make a new record.\u003C\u002Fli>\n\u003Cli>\u003Ccode>update_*\u003C\u002Fcode> — change an existing one, including wiring relations via \u003Ccode>*_ids[]\u003C\u002Fcode> arrays.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>That \u003Ccode>list\u003C\u002Fcode>\u002F\u003Ccode>read\u003C\u002Fcode> split is on purpose: bodies are heavy, so listing stays cheap and the agent only pulls a full body when it needs one. This is the same \u003Ca href=\"\u002Fhelp\u002Fthe-agent-first-thesis\">agent-first\u003C\u002Fa> design philosophy — a small, predictable surface an agent can hold onto.\u003C\u002Fp>\n\u003Ch2>What&#39;s in scope today\u003C\u002Fh2>\n\u003Cp>The surface covers the core operational entities. Read and write both work for:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Content\u003C\u002Fstrong> — list, read, create, update across all your \u003Ca href=\"\u002Fhelp\u002Fthe-unified-content-table\">content types\u003C\u002Fa> (blog posts, news posts, web pages, and the rest). An agent can draft a piece and set its status.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Artifacts\u003C\u002Fstrong> — the rich-text docs you attach to specs and notes. List, read, create, update.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Product-development entities\u003C\u002Fstrong> — the full \u003Ca href=\"\u002Fhelp\u002Fthe-product-development-concept\">PD spec\u003C\u002Fa>: solutions, features, models, attributes, controllers, policies, roles, lifecycles, views, layouts, components. Each has list\u002Fread\u002Fcreate\u002Fupdate, and relations wire through \u003Ccode>*_ids[]\u003C\u002Fcode>. There&#39;s also a schema overview the agent can read before it starts.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Events\u003C\u002Fstrong> — the \u003Ca href=\"\u002Fhelp\u002Fthe-product-development-concept\">analytics event registry\u003C\u002Fa>: list, read, create, update, including the junctions that tie an event to the controller that emits it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Emails\u003C\u002Fstrong> — list emails and read a template&#39;s HTML. Creating emails from the agent is on the near roadmap rather than live, so treat the email surface as read-leaning today.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Read-only helpers round it out: \u003Ccode>list_brands\u003C\u002Fcode> (start here to pick a brand), \u003Ccode>list_assets\u003C\u002Fcode>, and \u003Ccode>list_feed_items\u003C\u002Fcode> \u002F \u003Ccode>read_feed_item\u003C\u002Fcode> for the news pipeline.\u003C\u002Fp>\n\u003Ch2>The discipline the surface enforces\u003C\u002Fh2>\n\u003Cp>The MCP server ships rules the agent reads on connect. Three matter most:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cp>\u003Cstrong>Brand scoping is explicit.\u003C\u002Fstrong> Every brand-scoped tool takes a brand. The agent should call \u003Ccode>list_brands\u003C\u002Fcode> first and pass the right one on each call. If your workspace has exactly one brand, tools default to it; otherwise, no guessing. This is how m18t keeps an \u003Ca href=\"\u002Ffor\u002Fagencies\">agency&#39;s\u003C\u002Fa> thirty client brands from bleeding into each other.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>Search before create.\u003C\u002Fstrong> Before any \u003Ccode>create_*\u003C\u002Fcode>, the agent is told to run the matching \u003Ccode>list_*\u003C\u002Fcode> with a \u003Ccode>query\u003C\u002Fcode> to check for an existing record, and to prefer \u003Ccode>update_*\u003C\u002Fcode> over making a duplicate. Duplicate data is treated as a correctness failure, not a tolerated outcome.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>No delete, by design.\u003C\u002Fstrong> There is no delete tool in the surface today. To phase out a record, the agent sets its status to \u003Ccode>deprecate\u003C\u002Fcode> where that applies, or it escalates to you. The destructive operations are deliberately absent, which is what keeps the blast radius small enough to hand an agent a live connection.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>Where the surface stops\u003C\u002Fh2>\n\u003Cp>Be honest about the edges so you don&#39;t build a workflow on a tool that isn&#39;t there:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>No deletion, no bulk operations.\u003C\u002Fstrong> One record at a time; nothing erased.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No asset upload.\u003C\u002Fstrong> You can \u003Cem>list\u003C\u002Fem> assets, but uploading a file isn&#39;t exposed over MCP — that still happens in the \u003Ca href=\"\u002Fhelp\u002Fthe-workspace-media-hub\">Assets Manager\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Email creation is roadmap-adjacent.\u003C\u002Fstrong> Reading email templates works; creating them from the agent is not the live path yet.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Relations only where exposed.\u003C\u002Fstrong> Junctions wire through documented \u003Ccode>*_ids[]\u003C\u002Fcode> arrays. The agent shouldn&#39;t invent junction-wiring beyond those — if a relation isn&#39;t exposed, that&#39;s a gap to raise, not to work around.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>When the agent hits a missing tool, the right move is to surface it to you, not to improvise a workaround that bypasses the surface. The toolset is intentionally minimal at this beta phase; it grows deliberately.\u003C\u002Fp>\n\u003Ch2>FAQ\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Can an agent delete content or PD entities?\u003C\u002Fstrong>\nNo. There is no delete tool. The agent phases a record out by setting its status to \u003Ccode>deprecate\u003C\u002Fcode> (where that applies) or by escalating to you. Nothing is erased over MCP.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Will the agent create duplicates?\u003C\u002Fstrong>\nThe server instructs it to search first — run \u003Ccode>list_*\u003C\u002Fcode> with a \u003Ccode>query\u003C\u002Fcode>, and update an existing match rather than creating a new one. It&#39;s not a hard lock, but the discipline is built into the instructions the agent reads on connect.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Can an agent upload an image or generate one?\u003C\u002Fstrong>\nIt can list existing assets, but upload isn&#39;t exposed over MCP, and image generation lives in the \u003Ca href=\"\u002Fhelp\u002Fthe-graphics-generator\">Graphics Generator\u003C\u002Fa>, not the agent surface. Asset upload happens in the \u003Ca href=\"\u002Fhelp\u002Fthe-workspace-media-hub\">Assets Manager\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Why does \u003Ccode>list_*\u003C\u002Fcode> not return the full text?\u003C\u002Fstrong>\nBodies are heavy. \u003Ccode>list_*\u003C\u002Fcode> returns metadata so searching stays cheap; call the matching \u003Ccode>read_*\u003C\u002Fcode> with an id to pull a full body, template, or document.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Can the agent work across two brands at once?\u003C\u002Fstrong>\nOne connection covers the whole workspace, and the agent moves between brands by passing a different brand per call. It should call \u003Ccode>list_brands\u003C\u002Fcode> first and operate on the brand you name.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>What&#39;s next\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fconnecting-mcp-clients\">Connecting AI Agents via MCP\u003C\u002Fa> — set up the client first.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fthe-agent-first-thesis\">The Agent-First Thesis\u003C\u002Fa> — why the surface is shaped this way.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fthe-product-development-concept\">The Product Development Concept\u003C\u002Fa> — the entities the PD tools read and write.\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"\u002Fhelp\u002Fthe-unified-content-table\">The Unified Content Table\u003C\u002Fa> — the content model behind the content tools.\u003C\u002Fli>\n\u003Cli>Built for \u003Ca href=\"\u002Ffor\u002Fagencies\">agencies\u003C\u002Fa> and multi-project \u003Ca href=\"\u002Ffor\u002Ffounders\">solo operators\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"slug":9,"title":10},"agentic-workspace","Agentic Workspace (MCP)",{"meta_title":12,"meta_description":6,"keywords":13,"canonical_url":14,"og_title":5,"og_description":6,"og_image":15,"robots":16,"json_ld":17},"Programmatic Read & Write | m18t Help","programmatic read write, MCP tools, list read create update, brand scoping, search before create, no delete, content artifacts events, agent surface","https:\u002F\u002Fm18t.com\u002Fhelp\u002Fprogrammatic-read-write","https:\u002F\u002Fm18t.com\u002Fog-default.png","index, follow",{"@context":18,"@graph":19},"https:\u002F\u002Fschema.org",[20,33,58],{"@type":21,"headline":5,"description":6,"articleSection":10,"inLanguage":22,"datePublished":23,"dateModified":23,"image":15,"author":24,"publisher":28,"mainEntityOfPage":31},"Article","en","2026-06-25",{"@type":25,"name":26,"url":27},"Organization","m18t","https:\u002F\u002Fm18t.com",{"@type":25,"name":26,"url":27,"logo":29},{"@type":30,"url":15},"ImageObject",{"@type":32,"@id":14},"WebPage",{"@type":34,"mainEntity":35},"FAQPage",[36,42,46,50,54],{"@type":37,"name":38,"acceptedAnswer":39},"Question","Can an agent delete content or PD entities?",{"@type":40,"text":41},"Answer","No. There is no delete tool. The agent phases a record out by setting its status to deprecate (where that applies) or by escalating to you. Nothing is erased over MCP.",{"@type":37,"name":43,"acceptedAnswer":44},"Will the agent create duplicates?",{"@type":40,"text":45},"The server instructs it to search first — run list_* with a query, and update an existing match rather than creating a new one. It's not a hard lock, but the discipline is built into the instructions the agent reads on connect.",{"@type":37,"name":47,"acceptedAnswer":48},"Can an agent upload an image or generate one?",{"@type":40,"text":49},"It can list existing assets, but upload isn't exposed over MCP, and image generation lives in the Graphics Generator, not the agent surface. Asset upload happens in the Assets Manager.",{"@type":37,"name":51,"acceptedAnswer":52},"Why does list_* not return the full text?",{"@type":40,"text":53},"Bodies are heavy. list_* returns metadata so searching stays cheap; call the matching read_* with an id to pull a full body, template, or document.",{"@type":37,"name":55,"acceptedAnswer":56},"Can the agent work across two brands at once?",{"@type":40,"text":57},"One connection covers the whole workspace, and the agent moves between brands by passing a different brand per call. It should call list_brands first and operate on the brand you name.",{"@type":59,"itemListElement":60},"BreadcrumbList",[61,65,69,72],{"@type":62,"position":63,"name":64,"item":27},"ListItem",1,"Home",{"@type":62,"position":66,"name":67,"item":68},2,"Help","https:\u002F\u002Fm18t.com\u002Fhelp",{"@type":62,"position":70,"name":10,"item":71},3,"https:\u002F\u002Fm18t.com\u002Fhelp\u002Fcategories\u002Fagentic-workspace",{"@type":62,"position":73,"name":5,"item":14},4,1786312172840]