Read, write, edit, and search everything in a CharmIQ workspace — the entry point for almost every integration.
|
|
https://api.charmiq.ai/mcp/vfscharmiq:// URI:charmiq://{scope}/{id}[?version=...]
charmiq://.Web: https://team.charmiq.ai/source/wGPmxb8DN3kgivtbpYSF MCP: charmiq://source/wGPmxb8DN3kgivtbpYSF
workspace | |
charm | |
chat | |
folder | |
note | |
source | |
file |
root (or omitting the URI) refers to the user's root folder — start there when exploring.For Developers — Platform Pages ( charmiq://platform-page/…) are an additional admin-only scope. They appear in tool descriptions and discovery only when the calling user holds thePlatformPagePublishAdminrole.
version |
charmiq://workspace/abc123?version=4.showStyles (or pass false) for succinct content;showStyles: true for full RichtextMarkdown with authored and inherited CSS.format argument and URI parameter are rejected.nextRead arguments unchanged, concatenating only content:readProof, on its finalversion, and the same showStyles to write_file.grep_search returns at most 1,000 UTF-8 bytes around each match and 40,000 bytesinspect_styles with a document or Note URI and text (visible text or RMD),selector (public CSS), or a node URI. The result names winning and overriddencolorMode defaults to light; pass dark for dark-mode tokens.scope: document returns the exact editable RMD <style> block. scope: themereplace_string or apply_diff, passing scope: stylesheet and the inspectedversion. Match the exact <style> source; an empty match creates a missingoffset to select a candidate and limit (1–5, default 1) for more reports; pagingwrite_file submissions require the complete-read receipt and authoringreplace_string for a targetedshowStyles: true and write with that samechanged: false and writes no Version; a different spelling of the same documentreplace_string or apply_diff text identical to its matchchanged: false. A readProof still refuses an outdated version.clear_styles with the whole-document uri, inspected version, and antarget object from inspect_styles. Supply properties (CSS names) and/orclasses (class tokens) to remove. For example, properties: ["color"] removesvia; removing padding removes the entire declaration. Template-driven styles/classes are edited through their RMD source.inspect_styles.changed: false and writes no Version. Editorlist_dir | type=chat, by name or at its Place, never among the folder's contents |
read_file | |
clear_styles | |
inspect_styles | |
describe_file | storeStatus (storing, stored, or failed with its errorMessage). A Chat that belongs to a Workspace names that Workspace as parentDocument. verbose=true returns the structural outline and the current shares (who has which role) |
create_file | |
create_dir | |
import_file | |
upload_file | |
write_file | |
append_file | |
replace_string | |
apply_diff | |
delete_file | |
move | |
append_app_content | |
grep_search | |
semantic_search | type (note, workspace, charm, …), and scope it to a folder subtree (recursive=false for direct children only) or to root for documents not in any folder. Each result's parentUri is its folder, or the Workspace a Chat belongs to. include: ['thumbnail', 'thumbnailDark'] adds each result's thumbnails to the structured result, for programs that show them |
search_passages |
readOnlyHint: true; existing access checks still apply.format argument or URI parameter.read_file places a text summary first, followed by an MCP image block or an embeddedsearch_passages includes the complete matched chunks in both text and structured output.version reads that exact stored version after checking currentselection: { from, to } reads an editor range at the required version. These arenodeId, selector, startLine or endLine.describe_file before read_file. It returns the name, description, parent folder (or the Workspace a Chat belongs to), and a content preview. For Workspaces, verbose=true returns the structural outline (headings, lists, embedded applications). Often the outline is enough.grep_search for known text, semantic_search for unknown. Grep is fast and exact (case-insensitive, regex optional). Semantic is broader but costs an embedding call.semantic_search to find documents, search_passages to find the text. semantic_search returns which documents are relevant (name + URI) and supports folder scoping; search_passages returns the matching content chunks. They compose: search a folder, then pass the result URIs to search_passages to pull the passages.nextRead when more content is needed. For a targeted edit, a matching page or scoped read is enough; a complete overwrite requires every page.write_file — submit the complete document body with its readProof, authoring version and matching showStyles. Use a patch for a scoped change.replace_string — replace one exact snippet. Supply a versioned editor selection to restrict matching to that range; otherwise include surrounding context for a unique match.apply_diff — you have a unified diff. Best when you're producing diffs from an LLM that's already trained on the format.replace_string or apply_diff retains its container and styling. To remove a block, include its complete structural markup, or an adjacent separator for a plain paragraph. A single deletion hunk removes complete textblocks or single-block list items without turning their separators into blank paragraphs; fully selected lists and quotes are removed with their final child. Required cell paragraphs and item markers with unselected continuations or child lists are refused. An otherwise empty document retains its required paragraph. RMD may spell an empty paragraph as <p></p>; retaining its quote/list marker does not remove the block. Successful edits distinguish existing blocks emptied by the edit (newlyEmptyBlockIds) from new empty blocks it creates (createdEmptyBlockIds), excluding blocks refilled during collaboration.append_file is a special case: it skips the read entirely and appends to the end. Great for log-style documents.version and selection: { from, to } to read_file and replace_string.oldString against thenewString. Richtext ranges use RMD; Source selections remainversion argument overrides ?version=N on the URI. Positional selections requirefailed-precondition error statingcreate_file, create_dir, import_file and upload_file take an optional parent uri (Chat's create_chat likewise, and Agent's create_agent places the Charm Instructions it creates the same way). A named folder is used as given, and refused when you cannot add to it; 'root' creates at the root. When the uri is omitted, the file goes to the folder of the document the request comes from — the document a Charm runs in, or the document hosting an Application — when you can add to that folder, and shares its permissions. Otherwise (you only view that folder, the document is at the root, or there is no document, as for an external client) it goes to your root, private to you. Each tool's uri description says which applies to the request.callerTaskId URL parameter, create_dir also associates the new Folder withimport_file makes an editable document from a text file the client holds: thename and its text as content, at most 2,097,152 bytes as UTF-8.upload_file.upload_file is for a client that holds a file's bytes. It creates the file in theroot for the top level; the caller needs Editor on the folder) and returnsupload.url, the upload.headers to send with it exactly as given, andupload.expiresAt. PUT the bytes within 15 minutes:PUT {upload.url} {upload.headers} <the file's bytes>
size (at most 104,857,599 bytes),charmiq://file/{fileId}. An uploaded file stays a file, text included.create_file, import_file and upload_file take an optional place: where the filecreate_note takes (see the Note MCP Server): {url, label?} for a web page, or{segments}, with origin mcp (the default) or browser for a capture the browserdescribe_file returns a Material's place: its origin and segments, broad toplace: {"segments": […]}; send that as place to makemadeIntype, uri, and its title when you can readsavedFrom names the web page it was saved from (site, url).list_dir with a place lists the Materials you can read made at the Place and itstype names. {url} selects a{url, scope: 'site'} every page on its site, {segments} a Place prefix. Auri or nameSearch. For example, the files saved from a page:{ "name": "list_dir", "arguments": { "type": "file", "place": { "url": "https://arxiv.org/abs/2401.00001" } } }
workspace, charm, chat, source) | |
file) | |
delete_file returns the same way for both — if you need certainty, check the tool description before calling on an asset.list_dir on root or a known folder to confirm parent IDs before creating new content. URIs are stable, but folder structures change.describe_file over read_file for orientation. Cheap, structural, enough to decide whether to read deeply.semantic_search sparingly. It's powerful and not free. Cache results when the user is exploring one topic over multiple calls.?version=N on the URI. Otherwise you'll race the user's own edits.charmiq://charm/… URIs.charmiq://chat/…).