Seldonframe vs Next AI Draw IO

A side-by-side look at the Seldonframe and Next AI Draw IO MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Seldonframe logoSeldonframeDeveloper Tools · Local subprocess (stdio)Build, deploy, and sell AI agents for local-service businesses - from your IDE.65GreatAuth: not declaredNext AI Draw IO logoNext AI Draw IODeveloper Tools · Local subprocess (stdio)Draw and edit draw.io diagrams by chatting with an AI. Web app, desktop app, and an MCP server for Claude Code, Cursor, Codex and VS Code.72GreatAuth: api key required

Verdict: choose Seldonframe for developer tools work as a local process; choose Next AI Draw IO for developer tools as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Seldonframe logoChoose Seldonframe when

  • You need dedicated capabilities in the Developer Tools domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like create_full_workspace, create_workspace_from_google_paste, create_workspace_from_url.
Explore Seldonframe

Next AI Draw IO logoChoose Next AI Draw IO when

  • You need dedicated capabilities in the Developer Tools domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: API key required.
  • You want tools like get_drawing_guide, get_shape_library, start_session.
Explore Next AI Draw IO

Feature & specification comparison

Rows where the two servers differ are marked.

SpecSeldonframe logoSeldonframeNext AI Draw IO logoNext AI Draw IO
CategoryDeveloper ToolsDeveloper Tools
Quality signal65/100 · Great72/100 · Great
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredAPI key required
PricingNot declaredBYOK (pay the provider)
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars6336,387
Directory activity 1 views 0 installs 0 upvotes 3 views 0 installs 0 upvotes
Tools16016

Tools & capabilities

Seldonframe tools 160

  • create_full_workspaceAtomic workspace creation from pre-extracted business facts. Equivalent to create_workspace_v2 but single-call (no block-by-block iteration). Used as the follow-up after `create_workspace_from_url` for cases where the operator wants the workspace produced in one shot rather than block-iterated. Example: create_full_workspace({ business_name: 'Summit Air Comfort', city: 'Phoenix', state: 'AZ', phone: '(480) 555-2100', services: ['AC repair', 'heating installation', 'duct cleaning'], business_description: 'Residential and commercial HVAC in Phoenix', review_count: 950, review_rating: 4.7, trust_signals: ['licensed', 'bonded', 'insured'], emergency_service: true, same_day: true, service_area: ['Scottsdale', 'Tempe', 'Mesa'] }). MANDATORY FOLLOW-UP: same as create_workspace_v2 — after this returns `status: 'ready'`, ask 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).
  • create_workspace_from_google_pastePREFERRED when the operator pastes a Google Maps business listing. Same atomic pipeline as create_full_workspace; this tool's docs guide the paste-to-fields extraction. Claude Code parses the paste BEFORE calling this tool — never pass the raw paste text. EXTRACTION RULES (apply in order): 1) business_name → the bold business title at the top of the listing. 2) phone → the digits next to the phone icon. 3) address → the line next to the location pin. Parse city + state from this address into separate fields (city/state). 4) services → derive from BOTH the categories chip row (e.g. 'Plumber · Emergency plumbing service') AND any explicit 'Services' section ('Drain cleaning', 'Water heater repair'). Dedupe; keep 5-12 distinct strings. 5) business_description → synthesize 1-2 sentences from the categories + 'About' / 'From the business' section. Include industry words verbatim (the personality classifier reads this). 6) review_rating + review_count → the '4.7 ★ (950)' element. 7) trust_signals → 'Licensed', 'Bonded', 'Insured', 'Family-owned' if mentioned. 8) emergency_service / same_day → set true if 'open 24 hours', '24/7', 'same-day service' appears. 9) service_area → cities mentioned in 'Service area' section. 10) weekly_hours → parse the hours block ('Monday: 9 AM-5 PM, Tuesday: closed, ...') into the canonical shape: {monday:{enabled:true,start:'09:00',end:'17:00'},tuesday:{enabled:false,start:'09:00',end:'17:00'},...}. Keys MUST be FULL DAY NAMES (sunday/monday/.../saturday); times MUST be HH:MM 24-hour. 'Closed' → enabled:false (start/end are placeholders). 'Open 24 hours' → start:'00:00', end:'23:59'. These hours are written DIRECTLY to the booking template's availability — wrong shape = booking page falls back to Mon-Fri 9-5 default. 11) google_place_url → the Maps URL the operator pasted, if visible. Optional, stored on soul.business.maps_url for audit. MANDATORY FOLLOW-UP: same as create_full_workspace — after this returns `status: 'ready'`, ask 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).
  • create_workspace_from_urlEntry point for URL-based workspace creation. Returns instructions Claude follows: WebFetch the URL, optionally WebFetch up to 2 priority sub-pages (e.g. /about, /services, /contact, /pricing), extract structured business facts, ask the operator for any required field that can't be determined, then call `create_full_workspace` with the result — ONE atomic call that builds the workspace + the production multi-page website (vertical-aware landing + per-service detail pages, the same engine as the SeldonFrame dashboard) + booking page + intake form + CRM + draft chatbot. THIS TOOL DOES NOT CREATE A WORKSPACE — it returns the playbook. The workspace is created by the follow-up `create_full_workspace` call. Do NOT use the block-iterated create_workspace_v2 flow for URL builds. When operator provides ANY of: 'http://', 'https://', a domain (.com/.io/.net/.co/.app/.dev/.us etc), or 'create workspace for <URL>' — call this tool. Do NOT manually WebFetch first; the instructions returned by this tool tell you exactly what to fetch and in what order. MANDATORY FOLLOW-UP: After create_full_workspace returns, ask the operator 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).
  • generate_landing_pageGenerate a SeldonFrame-hosted landing page for an EXISTING workspace. USE-WHEN: operator explicitly asks for a landing page after the workspace exists, OR the client has no website of their own and the agency wants SeldonFrame to host the public-facing site. If the client already has a website (the common agency case), the chatbot embed snippet returned by create_workspace_from_url is the canonical deliverable; you do NOT need a generated landing page. Latency: ~30-60s. Returns the public landing URL. Operator can later customize per-block via update_landing_section / persist_block.
  • list_workspacesList all workspaces known to this device (plus any Pro workspaces if SELDONFRAME_API_KEY is set).
  • switch_workspaceSet the active workspace. Subsequent tool calls act on it by default.
  • clone_workspaceClone an existing workspace as a template. Example: clone_workspace({ source_workspace_id: 'wsp_x', name: 'Copy' })
  • link_workspace_ownerClaim an anonymously-created workspace under your real account. After linking, the admin URLs (dashboard, contacts, deals) become usable once you sign in at app.seldonframe.com. Requires SELDONFRAME_API_KEY to be set in the MCP environment. The workspace bearer token continues to work — no rotation needed. Example: link_workspace_owner({}) to claim the active workspace.
  • send_welcome_emailEmail the active workspace's four key URLs (landing, booking, intake, admin dashboard) to a user. Use this AFTER create_workspace, only when the user has explicitly given their email — never auto-send. The admin URL is bearer-token-scoped and expires in 7 days. If the workspace has an AI chatbot (create_full_workspace's response includes chatbot_embed_snippet + chatbot_agent_id), pass chatbot_url + chatbot_embed_snippet + chatbot_status so the welcome email also shows the chatbot card with its embed snippet — operators otherwise never learn the workspace shipped with a chatbot. All three are optional; omit them to send the classic 4-URL email. Example: send_welcome_email({ email: 'alice@example.com', name: 'Alice', chatbot_url: 'https://acme.app.seldonframe.com/chat', chatbot_embed_snippet: '<script src="..." async></script>', chatbot_status: 'test' }).
  • collect_operator_emailMANDATORY post-workspace step. Send the operator's welcome email + record them as a lead in SeldonFrame's CRM. EVERY workspace creation flow MUST end with this call — it is the only thing that triggers the welcome email (with the live URLs), creates their account so the admin login keeps working past the 7-day token, captures them in our pipeline so we can follow up, and lets Stripe pre-fill their email on upgrade. Skipping it leaves the operator with a one-shot URL and no way to recover access. Flow: after create_workspace returns, ask the user verbatim 'What email should I use for your account? This is where you'll get your login link and any notifications.' Then call this tool with whatever email they give you. If you'd rather use the wrapper, call `finalize_workspace({ email })` instead — same effect plus a formatted summary at the end. Example: collect_operator_email({ email: 'max@precisionplumbing.com', name: 'Max' })
  • finalize_workspaceONE-CALL CLOSING WRAPPER for the workspace creation flow. Bundles email collection (welcome email + lead capture via collect_operator_email) AND produces the final operator-facing summary (live URLs, what's configured, admin link). Call this as the LAST step of every workspace creation. After create_workspace returns, ask the user 'What email should I use for your account? This is where you'll get your login link and any notifications.' Then call this tool with the email they give you. Returns a `summary` string Claude Code should paraphrase verbatim to the operator. Use this instead of calling collect_operator_email directly when you want a single tool call to close the loop. Skipping this is the same as skipping email collection — leaves the operator with a one-shot URL and no recovery path. Example: finalize_workspace({ email: 'max@precisionplumbing.com', name: 'Max' }). The summary is agency-voice: addresses the operator AS an agency delivering for their SMB client, not as the workspace owner. When relaying to the operator, preserve the 'your client' framing throughout — don't rewrite to 'your workspace'.
  • revoke_bearerRevoke workspace bearer tokens. Useful if a device token has leaked or if a builder wants to rotate. Modes (pick exactly one): `{}` revokes ALL tokens except the current device's (safe default — other devices kicked off, this device keeps working); `{ token_id }` revokes a specific token by its UUID; `{ all: true }` revokes every token including the current one — requires SELDONFRAME_API_KEY because it locks this device out. After revoking the current token the MCP clears the local entry from ~/.seldonframe/device.json.
  • +148 more on the listing page

Next AI Draw IO tools 16

  • get_drawing_guideReturn the drawing guide: XML format, layout, edge routing, style and editing rules. start_session already returns it; call this only if the guide is no longer in your context. With topic, returns a short XML reference for tables, layers or groups.
  • get_shape_libraryGet the style syntax and shape names of a draw.io icon library. Call this BEFORE drawing with cloud, network or other icon shapes, and use the exact names it returns; never guess them. Libraries: - Cloud: aws4, azure2, gcp2, alibaba_cloud, openstack, salesforce - Networking: cisco19, network, kubernetes, vvd, rack - Business: bpmn, lean_mapping - General: flowchart, basic, arrows2, infographic, sitemap - UI/Mockups: android, material_design - Enterprise: citrix, sap, mscae, atlassian - Engineering: fluidpower, electrical, pid, cabinets, floorplan - Icons: webicons
  • start_sessionStart a new diagram session, or continue a saved one with session_id, and open the browser for real-time preview. Starts an embedded server and opens a browser window with draw.io. The browser will show diagram updates as they happen. The result includes the drawing guide; follow it when drawing.
  • list_saved_diagramsList the diagrams saved by earlier sessions (auto-save files), newest first, with their pages. Continue one with start_session session_id=<id>; the file path also works with load_diagram.
  • create_new_diagramCreate a NEW diagram, REPLACING the whole document: every page and any unsaved user changes (the previous state stays in History). To add a tab use add_page; to change cells use edit_diagram. Before using icon shapes (AWS, Azure, GCP, Kubernetes, Cisco...), call get_shape_library first. Follow the drawing guide returned by start_session (call get_drawing_guide if it is no longer in your context). Pass screenshot: true on the last call of a complex diagram to check the result. Accepted xml: 1) Only the mxCell elements of one page (recommended). The server adds <mxfile>, <mxGraphModel>, <root> and the root cells "0" and "1": <mxCell id="2" value="Shape" style="rounded=1;" x="40" y="40" w="120" h="60"/> 2) A bare <mxGraphModel> with <root> (one page). 3) A full <mxfile> with one or more <diagram> pages. Every page's <root> must start with <mxCell id="0"/><mxCell id="1" parent="0"/>. Rules: cells are siblings (never nested), ids are unique per page and start from "2", parent only for shapes inside a container, no XML comments, and shapes stay within x 0 to 800 and y 0 to 600. A style used by several cells is defined once with <mxStyle name="..." value="..."/> before the cells and used by name (see the drawing guide); html=1 and whiteSpace=wrap are added automatically. To clear the canvas to one blank page, send only the two root cells <mxCell id="0"/><mxCell id="1" parent="0"/>; the previous diagram stays in History.
  • load_diagramLoad a .drawio diagram into the current session, REPLACING the entire diagram (all pages). To change an existing file, load it here, edit with edit_diagram, then export_diagram to the same path; never rewrite the file by hand. Provide ONE of two mutually exclusive sources: 'path' (the server reads the file from disk — you do NOT need to read the file yourself or pass its XML through create_new_diagram) or 'xml' (the raw file content you already have — from another tool, a repository read, or an API response — so no temporary file needs to be written first). Both accept plain XML and draw.io's compressed save format. .drawio.svg (Editable SVG, the format export_diagram writes) is accepted too; .png files (also draw.io's editable PNG) and plain .svg files cannot be loaded. After loading from 'path' (or from compressed 'xml'), call get_diagram before edit_diagram — you haven't seen the file's cell IDs yet. Plain-XML 'xml' content you supplied yourself is already known and can be edited immediately.
  • edit_diagramEdit a specific page in the current diagram by ID-based operations (update/add/delete cells). All-or-nothing: if any operation fails, nothing is applied and every failure is listed. Freshness: the server remembers the last diagram state you have seen, and rejects this call only if the user edited the diagram in the browser since then. You do NOT need to call get_diagram before every edit: a rejected call changes nothing and includes the current XML of the page, so you can rebuild your operations and retry. Call get_diagram first only when you don't know the current diagram content (cell IDs, structure) — e.g. the diagram wasn't created in this conversation, or you're unsure your memory of it is accurate. Multi-page targeting: - page_id / page_name / page_index are optional; when all omitted, the FIRST page is targeted - Use list_pages to discover what pages exist Operations: - add: Add a new cell. Provide cell_id (new unique id within the page) and new_xml. One cell per operation. - update: Replace an existing cell by its id. Provide cell_id and complete new_xml. - delete: Remove a cell by its id. Only cell_id is needed. Its children and connected edges are deleted too, so give only a container's id. For add/update, new_xml is the complete mxCell (inside its <object> wrapper when it has custom data, see the drawing guide) in the compact form (a shape with x, y, w, h; an edge with source and target). No XML comments. Every " inside new_xml must be escaped as \" in the JSON. Example - Add a rectangle on the default (first) page: {"operations": [{"operation": "add", "cell_id": "rect-1", "new_xml": "<mxCell id=\"rect-1\" value=\"Hello\" style=\"rounded=1;\" x=\"100\" y=\"100\" w=\"120\" h=\"60\"/>"}]} Example - Delete a cell on the default page: {"operations": [{"operation": "delete", "cell_id": "rect-1"}]}
  • get_diagramGet the current diagram XML (fetches latest from browser, including user's manual edits). Call this when you don't know the current diagram content (cell IDs, pages, structure) — e.g. before editing a diagram you didn't create in this conversation, or after edit_diagram was rejected because the user changed the diagram in the browser. Returns the full <mxfile> by default. If a page selector is provided, returns just that page's <mxGraphModel> embedded in a one-page <mxfile> wrapper.
  • get_selectionReturn the cells the user has selected in the preview: their ids and labels, for edges the source and target ids, for shapes the position and size, and the page they are on. Call this when the user refers to what they selected ("this box", "these arrows", "the selected shapes"), then act on the ids with edit_diagram. Says when nothing is selected. Needs the preview tab to be open.
  • screenshot_diagramRender the diagram in the preview and return it as a PNG image, so you can see your own result. Call this once after drawing or heavily editing a complex diagram, then fix overlaps and edges that cross shapes. Without a page selector it shows the page on screen; with one it renders that page without changing what the user sees. Needs the preview tab to be open.
  • export_diagramExport the current diagram to a file. Supports .drawio (XML), .png, .svg, and .drawio.svg (an SVG with the diagram embedded, which draw.io and load_diagram can open again). The format is auto-detected from the file extension, or can be specified explicitly. Images get a 20 px margin; a PNG has a white background (or the page's own background color) unless transparent is true. Multi-page behaviour: - .drawio with NO page selector: writes the full <mxfile> (all pages). - .drawio with a page selector: writes a single-page <mxfile> containing only that page. - .png / .svg with NO page selector: exports the currently active page in the browser. - .png with a page selector: renders that page without changing what the user sees. - .svg / .drawio.svg with a page selector: temporarily loads that page into the browser, captures it, then restores the full document (the user sees a brief flicker).
  • list_pagesList every page (tab) in the current diagram. Returns each page's id, name, 0-based index, and cell count. Use this to discover what pages exist before targeting one with edit_diagram, get_diagram, export_diagram, rename_page, or delete_page.
  • +4 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Seldonframe

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "mcp-324": {
      "command": "npx",
      "args": [
        "-y",
        "@seldonframe/mcp"
      ]
    }
  }
}

Next AI Draw IO

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "next-ai-draw-io": {
      "command": "npx",
      "args": [
        "-y",
        "@next-ai-drawio/mcp-server@latest"
      ]
    }
  }
}

Frequently asked questions

Seldonframe is categorized under Developer Tools and uses a local stdio subprocess. Next AI Draw IO belongs to Developer Tools and uses a local stdio subprocess. Pick Seldonframe for developer tools work and Next AI Draw IO for developer tools.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Seldonframe has no declared pricing — check the project's own site. Next AI Draw IO is bring-your-own-key: usage is billed by the API provider you supply a key for. Auth: api key required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add mcp-324 and next-ai-draw-io as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Seldonframe has a quality signal of 65/100 (Great) with 1 views, 0 installs and 63 GitHub stars. Next AI Draw IO has 72/100 (Great) with 3 views, 0 installs and 36,387 GitHub stars.