Atlas / MCP servers / getmodern-ai / graft

graftBLOCK

mcp/getmodern-ai/graft

Graft writes the API integration your agent is missing, on demand, and serves it over MCP. Connect Claude, ChatGPT, Hermes or OpenClaw; the model reads the vendor docs, writes and verifies a small tool, and the proxy injects the credential so it never reaches the code. Self-hostable with Docker and

Verdict
BLOCK
Grade
F
Trust score
35 /100
Exposed tools
51 40r · 9w · 2d
Transport
streamable-http
License
Apache-2.0
Stars
5
01

Overview

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

Graft gives an agent the integration it is missing. The basics of thirteen integrations are ready-made; anything else is written on demand against the integration's real API, verified before use, and handed to the agent as an MCP tool.

Add Graft to Claude, Claude Code, Codex, ChatGPT, Hermes or OpenClaw as one MCP server. When the agent hits a task no tool covers, it calls find_tool, and a ready-made tool for a connected integration is one call from its list. When nothing fits, it calls acquire. Graft's own coding model reads the integration's documentation, writes the smallest module that makes the call, checks it, proves it with reads, publishes it, dry-runs it against the live API with every write stopped at a proxy, and promotes it into that agent's tool list. The credential never enters the module, the sandbox or the model. When the agent stops using a tool it leaves the list again, and stays in the toolbox one call from coming back.

Four words are used exactly as CONTEXT.md defines them. A harness is the agent software you run. A person is the account holder. An integration is a service Graft can connect, Gmail or Slack or your own API, and a connection is one account of it that you have given Graft.

Connect it

Claude, Claude Code, Codex and ChatGPT need no token. Give the product your Graft origin plus /mcp: as a custom connector in Claude, with claude mcp add --transport http in Claude Code, with codex mcp add in Codex, or as an MCP app under Plugins in ChatGPT with Developer mode on.

https://your-graft.example/mcp

The product discovers Graft's own authorization server from that endpoint, registers itself, and sends you to the console to consent. The consent mints the agent the connector will be, or hands it the agent Setup minted for it, and you choose what it reaches: every connection of yours, the default for Claude and ChatGPT, or a list. A client Graft does not vouch for starts

Read from source at commit c00e48f7cae2OBSERVED · 2026-10-14
Advertisement
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 vault --env CANDO_TOKEN=${CANDO_TOKEN} --env GRAFT_MODEL_API_KEY=${GRAFT_MODEL_API_KEY} --env GRAFT_MODEL_AUTHORING=${GRAFT_MODEL_AUTHORING} --env GRAFT_TOKEN=${GRAFT_TOKEN} -- npx -y @graft/[email protected]
claude-desktop
{
  "mcpServers": {
    "vault": {
      "command": "npx",
      "args": [
        "-y",
        "@graft/[email protected]"
      ],
      "env": {
        "CANDO_TOKEN": "${CANDO_TOKEN}",
        "GRAFT_MODEL_API_KEY": "${GRAFT_MODEL_API_KEY}",
        "GRAFT_MODEL_AUTHORING": "${GRAFT_MODEL_AUTHORING}",
        "GRAFT_TOKEN": "${GRAFT_TOKEN}"
      }
    }
  }
}
03

Exposed tools (51)

40 read · 9 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
ChatGPTreadWeb & desktop
ClaudereadWeb & desktop
CodexreadApp, CLI & IDE
HermesreadLocal agent
OpenClawreadLocal agent
areadb
alphareadRead this: always
authoringwriteHow to write a module.
betareadSay
count-thingsreadCounts things at Revocable.
create-customerwriteCreates a customer.
create-itemwriteCreates an item
create-orderwriteCreates an order
current-weatherreadReads the current temperature for a city from Open-Meteo.
current-weather-cityreadCurrent weather in a city.
decoyreadAnswers a result shaped like the server
decoy-countsreadAnswers a result wearing the wide event
delete-itemdestructiveDeletes an item.
download-reportreadDownloads a file from Files by its id and answers it as a blob ref.
echoreadEcho.
export-filereadDownloads the Demo Orders export as a file.
graft-askreadThe card Graft shows for an ask a tool answers with: a build approval, a connection confirmation or a scope ask the person answers in place, or the link to answer it in the console; and the offer of Setup, which opens the console
greetreadGreets whoever asks, by listing Demo items.
helloreadGreets a name through the vendor
list-issuesreadLists Linear issues.
list-itemsreadLists items
list-items-retryreadLists items from Demo Orders, up to a limit — the documented path.
list-latest-inbox-conversationsreadLists the latest conversations in the inbox with subject, sender and snippet.
list-messagesreadLists messages
list-open-issuesreadLists the open issues of a GitHub repository.
list-ordersreadLists orders
list-reboundreadLists items from Demo Orders, again.
list-reposreadLists repositories and notes the first.
list-thingsreadLists things
never-passedreadLists items from Demo Orders, though no version of it has passed.
ok-namereadd
otherreadx
padreadPads a word on the left
pingreadPing the other vendor.
post-notewritePosts a note to a Demo Orders channel.
recent-reposreadLists the authenticated user
refund-paymentreadRefunds a charge.
save-placewriteSaves a place.
save-reportwriteSaves the Demo Orders report as a file.
search-placesreadFinds a place by name in Demo Orders
their-toolreadAnother person
triagereadHow to triage
update-orderwriteUpdates an order
upload-filewriteUploads a file to a Demo Orders channel.
upload-reportdestructiveUploads a file held as a blob into a Drop folder.
xreadd
04

Trust audit

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

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

What the source does

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

Findings (25)

CRITICALHard-coded secrets · secret.github · CWE-798, CWE-321
packages/evals/src/github-vendor.ts:16
export const GITHUB_TOKEN = "ghp_evalFakeToken0123456789abcdefghijkl";
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sandbox-docker/src/backend.ts:553
const made = await exec({
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sandbox-docker/src/backend.ts:572
const result = await exec({
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sandbox-docker/src/backend.ts:584
const started = await exec({
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sandbox-docker/src/backend.ts:608
const polled = await exec({
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/sandbox-docker/src/backend.ts:701
const listed = await exec({
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHSupply chain · supply.typosquat · CWE-829, CWE-1357
packages/check/package.json
typescript6 ~ typescript
Why it matters. dependency name one edit from a popular package
Fix. verify the package; likely typosquat
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/proxy/src/snowflake-jwt.ts
snowflake-jwt.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/ask-matt
.claude/skills/ask-matt
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/claude-handoff
.claude/skills/claude-handoff
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/codebase-design
.claude/skills/codebase-design
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/diagnosing-bugs
.claude/skills/diagnosing-bugs
Why it matters. link not followed
MEDIUMInventory / provenance · inv.symlink · CWE-1104
.claude/skills/domain-modeling
.claude/skills/domain-modeling
Why it matters. link not followed
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
apps/web/scripts/check-token-utilities.mjs:98
console.log(`checked ${used.size} design-token utilities against ${tokens.length} tokens`);
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/stock/tools/gmail/get-message/recording.json:126
"data": "DUW-QD7sCy7JSIM-CWV-XNcdXTX3zTvzKDXgbDLnEs40SRkjLf7qM08ilAYnfFEmGN6vYNXzyEGygCYloPKkJTJ8UQB0DuwacZ5LAq6WSMuqEa9FGWe1jR0ShzZ2PJHbxgZwAZXbvABhlxmjS5roaGq3Zw4cw04gO4A4xN3gLRXmILQbJ0zaJJO0R4V8eDk
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
packages/stock/tools/gmail/get-thread/recording.json:131
"data": "WDSLE4OSMIXEAHe2uMatYKSRVCsWTNIqSr8PW4HqN8NJNPRKHITOFNRtQwSmGVAeoqOexMizxiLiLg4ACyGlWic2lSZ0Zp10k4oqjbXmh8NcS9UYF5hiwV4gOS5IICZgaHi3cLpdCGLaRD2qxCWax38jwW2bnKHwQv9RGQu1jXnnxQ3udrY4Ttx0fWR2Kh6
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
apps/server/src/database.integration.test.ts:122
const MODEL_API_KEY = "sk-ant-a-persons-own-model-key-0123456789";
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:58
TEST_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/graft_test
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:243
-e GRAFT_DATABASE_URL=postgresql://postgres:postgres@nowhere:5432/graft \
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:250
-e GRAFT_DATABASE_URL=postgresql://postgres:postgres@nowhere:5432/graft \
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/ci.yml:256
-e GRAFT_DATABASE_URL=postgresql://postgres:postgres@nowhere:5432/graft \
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
AGENTS.md:255
`TEST_DATABASE_URL=postgresql://postgres:password@localhost:5432/graft pnpm --filter @graft/server test`.
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/server/src/api.test.ts:90
secret: "api-test-handoff-secret-that-is-long-enough-32",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/server/src/app.test.ts:40
const SECRET = "test-secret-that-is-long-enough-32";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
apps/server/src/app.test.ts:43
const API_KEY = "sk_live_the_real_vendor_key";

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-14 · audit v0.4.1 · source sha c00e48f7cae2full audit observations/trust-audit/mcp-server/getmodern-ai__graft.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-14c00e48f7cae2BLOCKF35first audit
06

Questions

What is the graft MCP server?

Graft writes the API integration your agent is missing, on demand, and serves it over MCP. Connect Claude, ChatGPT, Hermes or OpenClaw; the model reads the vendor docs, writes and verifies a small tool, and the proxy injects the credential so it never reaches the code. Self-hostable with Docker and

What tools does graft expose?

51 in total: 40 read-only, 9 that write, and 2 that can delete or overwrite (delete-item, upload-report). Every one is listed on this page with its risk.

Is graft safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (35/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does graft need?

It reads CANDO_TOKEN, GRAFT_MODEL_API_KEY, GRAFT_MODEL_AUTHORING and GRAFT_TOKEN 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 graft run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @graft/vault at 0.0.0.

How current is this page?

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

Advertisement