Atlas / MCP servers / basementstudio / xmcp

xmcpBLOCK

mcp/basementstudio/xmcp

The TypeScript MCP framework

Verdict
BLOCK
Grade
D
Trust score
60 /100
Exposed tools
75 72r · 3w · 0d
Transport
streamable-http
License
MIT
Stars
1,337
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Feature PRs that change core package behavior should include a changeset:

pnpm changeset

The core packages (xmcp, @xmcp-dev/compiler, create-xmcp-app, and init-xmcp) version together. UI and plugin packages version independently. Merge the generated Version Packages PR to publish unpublished versions through the stable workflow.

@xmcp-dev/cli is ignored by stable versioning and has a separate manual publish workflow. Before Changesets decides whether to version or publish, the stable workflow removes ignored-only changesets from its disposable checkout. Those changesets remain in git; they must not prevent publishing already-versioned packages. Mixed and empty changesets retain the normal Changesets behavior.

Run the release-decision regression checks with:

node --test scripts/prepare-stable-release.test.cjs
Read from source at commit fcaa495ab7b1OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add xmcp --env API_KEY=${API_KEY} --env BETTER_AUTH_BASE_URL=${BETTER_AUTH_BASE_URL} --env BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET} --env BILLING_SECRET_KEY=${BILLING_SECRET_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "xmcp": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "API_KEY": "${API_KEY}",
        "BETTER_AUTH_BASE_URL": "${BETTER_AUTH_BASE_URL}",
        "BETTER_AUTH_SECRET": "${BETTER_AUTH_SECRET}",
        "BILLING_SECRET_KEY": "${BILLING_SECRET_KEY}"
      }
    }
  }
}
03

Exposed tools (75)

72 read · 3 write · 0 destructive.

ToolRiskDescription
addwriteAdd two numbers
ai_chatreadChat with AI, tracks token consumption per model
ai_generatereadGenerate content with AI, tracks 1 unit per call
app-configreadApplication configuration data
browser-navigatereadNavigate to a URL
classify-sentimentreadClassify sentiment using example exchanges
client-inforeadEcho request client identity
completion-membersreadTeam member profiles
confirmreadAsk for confirmation
counterreadCounter React
create-userwriteCreate a new user in the system
disabled-metadatareadDisabled UI tool
echoreadEcho text
experimental-greetingreadA greeting that is not available yet
exportreadExport data in multiple formats, Pro plan only
extra-argumentsreadAccess extra arguments from a tool call, including repeated HTTP client info headers
failreadReturn an application error
feature-extrareadFeature fixture tool
few-shotreadClassify sentiment
get-alertsreadGet the alerts for a state
get-forecastreadGet the forecast for a state
get-library-docsreadGet the docs for a library
get-my-membershipsreadReturns the user
get-petreadRead a pet from the local example API
get-timereadGet the current time, optionally in a specific timezone
get-userreadGet details of a specific user by their ID
get-user-inforeadGet user details
get-weatherreadGet current weather for a location
get_docreadFetch the full Markdown of a docs page. Pass a docs path like
greetreadGreet the user
hash-stringreadHash a string using SHA-256
helloreadSays hello to a user
hostThemeDemoreadHost-Aware Workspace demo for MCP Apps: host context, CSS variables, view modes, safe areas, and size reporting.
identityreadInspect the current request
inforeadStatic fixture data
internal-dashboardreadAn internal dashboard excluded by the component visibility rules
list-usersreadList all users in the system
liveToolDemoreadOps Console demo for MCP Apps: tool calling, polling, host connection state, and granted view modes in one operator workflow.
logread
mcp-app-playbookreadSmall reference document used by the ui showcase resource/composer demo.
media-contentreadReturn mixed media content
media-previewreadReturn a one-pixel PNG and an embedded description
metadata-promptreadMetadata example
metadata-toolreadMetadata example
navigatereadNavigate the current browser tab to a same-origin path on the xmcp site, e.g.
preview-elicitationreadPreview a basic extra.elicit() flow in MCPJam
preview-input-requiredreadAsk the user to confirm before applying a theme, using a multi round-trip input_required result (protocol 2026-07-28; 2025-era clients are served through the SDK
preview-samplingreadPreview a basic extra.sample() flow in MCPJam
preview_elicitationreadDemonstrate extra.elicit() flows for screenshots and manual verification
random-numberreadGenerate a random number
renderJsonreadRender a full @xmcp-dev/ui AppSchema for MCP Apps-compatible clients. Before generating the schema, read the skill://xmcp-ui/schema-reference resource for the full component catalog and schema format. The JSON must include at least title, mcpServerUrl, and a root component object.
reportreadGenerate a demo report. Costs three quota units.
request-contextreadRead request details from an async helper without passing tool arguments
request-helpersreadExercise local values and request notifications
request-progressreadNormalize a list and report progress using request-local values
resourceComposerDemowriteResource and Composer demo for MCP Apps: read a real resource, send a message, and update model context through the host.
review-codereadReview code for best practices and potential issues
schemaAppDemoreadSchema-driven MCP App demo that runs through host-backed transport and calls tools via declarative actions.
searchreadSearch xmcp documentation.
search_docsreadFull-text search across the xmcp documentation. Returns a ranked list of matching pages with their titles and URLs. Use get_doc to read a result.
serverStatsreadReturns live server metrics. Used by the ui showcase MCP App demos as a backend data source.
shadcnDemoreadA local shadcn Card sharing the xmcp UI kit
show-external-urlreadCreates a UI resource displaying an external URL (example.com).
show-raw-htmlreadCreates a UI resource displaying raw HTML.
show-remote-domreadCreates a UI resource displaying a remote DOM script.
showcasereadLanding page for the refreshed ui showcase, organized around real MCP App examples and a smaller component reference set.
team-greetingreadGenerate a greeting for team members
uiKitDemoreadStarter MCP App built with @xmcp-dev/ui components.
userreadTemplated fixture data
user-profilereadUser profile information
validate-emailreadValidate the format of an email address.
weatherreadWeather App
whoamireadReturns the full Auth0 user session and account information
xmcp-e2ereadConformance fixture
xmcp-ui-schema-referencereadComponent catalog and schema format for generating valid xmcp UI JSON
04

Trust audit

BLOCKgrade D · trust 60/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (5 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
packages/compiler/src/telemetry/events/post-payload.ts
post-payload.ts
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/compiler/src/compiler/parse-xmcp-config.ts:173
const func = new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
MEDIUMHard-coded secrets · inv.env_committed · CWE-798, CWE-321
examples/middlewares-api-key/.env
.env
Why it matters. a real .env in the package
Fix. ship .env.example with placeholders only
LOWInventory / provenance · inv.hidden_file · CWE-1104
.eslintrc.js
.eslintrc.js
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
examples/middlewares-api-key/.env
.env
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
packages/compiler/.eslintrc.js
.eslintrc.js
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.symlink · CWE-1104
README.md
README.md
Why it matters. link not followed
LOWCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
apps/website/utils/frontmatter.ts:8
return (yaml.load(input) ?? {}) as object;
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/compiler/src/compiler/schema-inference/__tests__/inference.test.ts:41
return new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/compiler/src/compiler/schema-inference/__tests__/watch.test.ts:99
new Function(
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/compiler/src/utils/path-to-tool-name.ts:56
.createHash("md5")
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
packages/xmcp/src/runtime/utils/path-to-tool-name.ts:56
.createHash("md5")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/ci.yml:48
- run: pnpm --filter descope-http-example exec node ../../packages/xmcp/dist/cli.js build
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/ci.yml:51
- run: pnpm --filter sentry-http exec node ../../packages/xmcp/dist/cli.js build
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/ci.yml:55
- run: pnpm --filter supabase-http exec node ../../packages/xmcp/dist/cli.js build
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/ci.yml:59
- run: pnpm --filter billing-http exec node ../../packages/xmcp/dist/cli.js build
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
.github/workflows/ci.yml:63
- run: pnpm --filter coinbase-http exec node ../../packages/xmcp/dist/cli.js build
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/website/content/blog/better-auth-integration.mdx:195
baseURL: process.env.BETTER_AUTH_BASE_URL || "http://127.0.0.1:3001",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/website/content/docs/core-concepts/tools.mdx:353
3. Connect MCPJam to `http://127.0.0.1:3001/mcp`.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/website/content/docs/core-concepts/tools.mdx:486
3. Connect MCPJam to `http://127.0.0.1:3001/mcp`.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/website/content/docs/guides/authentication.mdx:85
"http://127.0.0.1:3000/callback",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
apps/website/content/docs/integrations/auth0.mdx:103
AUDIENCE=http://127.0.0.1:3001/
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
apps/website/components/icons.tsx:293
d="M21 3H20V4H19V5H18V6H17V7H16V8H15V9H14V10H13V11H12V12H11V13H10V14H9V15H8V16H7V17H6V18H5V19H4V18H3V17H4V16H5V15H6V14H7V13H8V12H9V11H10V10H11V9H12V8H13V7H14V6H15V5H16V4H17V3H18V2H19V3H20V4H21V5H22V6H

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha fcaa495ab7b1full audit observations/trust-audit/mcp-server/basementstudio__xmcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12fcaa495ab7b1BLOCKD60first audit
06

Questions

What is the xmcp MCP server?

The TypeScript MCP framework

What tools does xmcp expose?

75 in total: 72 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is xmcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (60/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does xmcp need?

It reads API_KEY, BETTER_AUTH_BASE_URL, BETTER_AUTH_SECRET, BILLING_SECRET_KEY, CLERK_SECRET_KEY, CLIENT_SECRET, COMMET_API_KEY, DEMO_API_KEY, DEMO_CUSTOMER_A_KEY, DEMO_CUSTOMER_B_KEY, GITHUB_TOKEN and GOOGLE_CLIENT_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does xmcp run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as xmcp at 1.7.1.

How current is this page?

The grade is for one exact copy of the source (fcaa495ab7b1), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement