Skip to content

Platform Matrix

Last verified: 2026-09-29. This is the single source of truth for paths, fields, and config shapes in this guide.

~ means your home directory (C:\Users\<you> on Windows). Always write paths inside skills and configs with forward slashes.

Claude Code Claude.ai / Desktop Claude API Cursor
Project location .claude/skills/<name>/SKILL.md n/a n/a .cursor/skills/, .agents/skills/, and also .claude/skills/, .codex/skills/
Personal location ~/.claude/skills/<name>/ Uploaded as a ZIP in Settings → Capabilities Uploaded via the Skills API ~/.cursor/skills/, ~/.agents/skills/, and also ~/.claude/skills/, ~/.codex/skills/
Plugins Yes (plugin skills/ folder) n/a n/a Yes (Cursor plugins)
Auto-invocation From description From description From description (needs the code execution tool) From description
Manual invocation /skill-name Ask for it by name n/a /skill-name, or as a Custom Mode for a whole session
Reserved dir none none none ~/.cursor/skills-cursor/ (Cursor’s built-ins; don’t write here)

Cross-platform tip: a skill in .claude/skills/ (project) or ~/.claude/skills/ (personal) is picked up by both Claude Code and Cursor. .agents/skills/ is the vendor-neutral path from the open Agent Skills standard.

Field Spec (all platforms) Claude Code Cursor Notes
name Required ✓ ✓ (must match the folder name) ≤64 chars, a-z 0-9 -; must not contain anthropic or claude on Anthropic surfaces
description Required ✓ ✓ ≤1024 chars, no XML tags; say what and when
disable-model-invocation ✓ ✓ true = only runs when invoked explicitly
allowed-tools Optional (experimental in spec) ✓ – Tools usable without asking while the skill is active
argument-hint ✓ – Hint shown for /skill-name <args>
model ✓ – Override the model while the skill runs
paths (legacy globs) – ✓ Only offer the skill for matching files
license, compatibility, metadata Optional ✓ metadata ✓ Free-form; safe everywhere
icon, color – ✓ Custom Mode badge

Unknown fields are ignored by platforms that don’t support them, so you can safely combine fields in one file.

Claude Code Cursor
Project location .claude/agents/<name>.md .cursor/agents/, and also .claude/agents/, .codex/agents/
Personal location ~/.claude/agents/ ~/.cursor/agents/, and also ~/.claude/agents/, ~/.codex/agents/
Precedence Project over user Project over user; .cursor/ over .claude/ and .codex/
Manage /agents command Customize panel, or /create-subagent
Invoke Automatic (from description) or “use the X subagent” / @-mention Automatic, /name, or “use the X subagent”
Built-ins Explore, Plan, general-purpose explore, bash, browser
Nesting Subagents cannot spawn subagents One level deep
Field Claude Code Cursor Notes
name ✓ required ✓ (defaults to filename) lowercase + hyphens
description ✓ required ✓ Drives delegation. “Use proactively when…” encourages automatic use
tools ✓ comma-separated allowlist (omit to inherit all) ✗ not supported: subagents inherit all parent tools Use readonly in Cursor to restrict
model sonnet, opus, haiku, inherit, or a model ID inherit or a model ID (options in brackets, e.g. [effort=high])
readonly – ✓ blocks edits and state-changing shell
is_background – ✓ doesn’t block the parent
permissionMode, skills, color ✓ – Claude Code extras

Cross-platform tip: a subagent in .claude/agents/ with only name, description, and model: inherit works in both. If you add tools:, Claude Code honours it and Cursor ignores it, so don’t rely on tools for safety in Cursor.

Claude Cursor
CLI (headless) claude -p "prompt" agent -p "prompt" --output-format json
TypeScript SDK @anthropic-ai/claude-agent-sdk @cursor/sdk (Node ≥ 22.13)
Python SDK claude-agent-sdk (import claude_agent_sdk) cursor-sdk (import cursor_sdk, Python ≥ 3.10)
Auth ANTHROPIC_API_KEY (or Bedrock/Vertex env) CURSOR_API_KEY
Loads project config Only with settingSources (e.g. ["project"]) Local: only with local.settingSources; Cloud: always
Cloud / remote runs Your own infrastructure Cursor Cloud Agents (SDK or REST API)
Cursor Claude Code Claude Desktop Claude.ai (web)
Project config .cursor/mcp.json .mcp.json (project root) n/a n/a
User config ~/.cursor/mcp.json ~/.claude.json (via claude mcp add --scope user) %APPDATA%\Claude\claude_desktop_config.json (Win) / ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) Settings → Connectors
Add via CLI/UI Customize → MCPs claude mcp add Settings → Developer → Edit Config, or install a .mcpb bundle “Add custom connector” (remote URL only)
Transports stdio, SSE, Streamable HTTP stdio, SSE, HTTP stdio (local), remote via connectors Remote (Streamable HTTP / SSE) only
Env interpolation ${env:NAME}, ${workspaceFolder}, ${userHome} ${NAME}, ${NAME:-default} in .mcp.json Literal values in env n/a
OAuth Dynamic + static (auth object) Yes (/mcp to authenticate) Via connectors Yes
Logs Output panel → “MCP Logs” claude --debug, /mcp %APPDATA%\Claude\logs\mcp*.log n/a

All of the file-based configs use the same top-level key:

{ "mcpServers": { "<server-name>": { "command": "...", "args": [] } } }
Current (stable) Previous
Spec 2026-07-28 2025-06-18 / 2025-11-25. v2 servers still serve 2025-era initialize openings by default
TypeScript @modelcontextprotocol/server 2.x (plus /client, /express, /hono, /fastify, /node), Zod 4 @modelcontextprotocol/sdk 1.x, Zod 3
Python mcp 2.x: from mcp.server.mcpserver import MCPServer mcp 1.x: from mcp.server.fastmcp import FastMCP
Inspector npx @modelcontextprotocol/inspector · Python: mcp dev server.py same

Both templates in 03-mcp/templates/ are tested against the current versions by npm run qa:templates.

Claude Code Cursor
Project instructions CLAUDE.md (root and subfolders) AGENTS.md (root and subfolders), .cursor/rules/*.mdc
Personal ~/.claude/CLAUDE.md User Rules (Customize → Rules)
Rule types n/a Always / file globs / intelligent (description) / manual (@rule)
Claude Code Cursor
Location .claude/settings.json → hooks .cursor/hooks.json, ~/.cursor/hooks.json
Key events PreToolUse, PostToolUse, UserPromptSubmit, Stop, SubagentStop, SessionStart preToolUse, postToolUse, beforeShellExecution, beforeMCPExecution, afterFileEdit, subagentStart, stop, …
Block an action Exit code 2 Exit code 2

Cursor can also load Claude Code hooks.

Re-verify against these when updating the matrix: