Atlas / MCP servers / earendil-works / Pi

PiBLOCK

mcp/earendil-works/pi

AI agent toolkit: unified LLM API, agent loop, TUI, coding agent CLI

Verdict
BLOCK
Grade
F
Trust score
39 /100
Exposed tools
133 114r · 16w · 3d
Transport
streamable-http
License
MIT
Stars
114,265
01

Overview

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

New issues and PRs from new contributors are auto-closed by default. Maintainers review auto-closed issues daily. See CONTRIBUTING.md.

Pi is a minimal, extensible agent harness that you can make your own.

Adapt Pi to your workflows, not the other way around. Customize Pi with extensions, skills, prompt templates, and themes. Bundle them as Pi packages and share via npm or git.

Pi ships with powerful defaults but skips features like sub-agents and plan mode. Ask Pi to build what you want, or install a package that does it your way.

Use Pi interactively, automate it in print or JSON mode, control it over RPC, or build apps with the Pi TypeScript SDK. See OpenClaw for a real-world integration.

Getting started

Install the command-line interface:

curl -fsSL https://pi.dev/install.sh | sh

On Windows:

powershell -c "irm https://pi.dev/install.ps1 | iex"

The installer pins all dependencies and updates Pi with pi update. Alternatively, install directly with npm, which does not pin transitive dependenci

Read from source at commit 4dcd6d34635cOBSERVED · 2026-10-11
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 pi-tui --env ACME_STREAM_API_KEY=${ACME_STREAM_API_KEY} --env AI_GATEWAY_API_KEY=${AI_GATEWAY_API_KEY} --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env ANTHROPIC_AUTH_TOKEN=${ANTHROPIC_AUTH_TOKEN} -- npx -y @earendil-works/[email protected]
claude-desktop
{
  "mcpServers": {
    "pi-tui": {
      "command": "npx",
      "args": [
        "-y",
        "@earendil-works/[email protected]"
      ],
      "env": {
        "ACME_STREAM_API_KEY": "${ACME_STREAM_API_KEY}",
        "AI_GATEWAY_API_KEY": "${AI_GATEWAY_API_KEY}",
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "ANTHROPIC_AUTH_TOKEN": "${ANTHROPIC_AUTH_TOKEN}"
      }
    }
  }
}
03

Exposed tools (133)

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

ToolRiskDescription
__pi_deferred_placeholder__readReserved placeholder. Never available. Never call this.
arg-testreadtest
attachreadAttach it.
badreadbad
base_toolreadbase_tool tool
bashwriteExecute a bash command in the current working directory. Returns combined stdout and stderr. Output is truncated to last ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). If truncated, full output is saved to a temp file. Optionally provide a timeout in seconds.
blobreadStream a blob
brokenreadStarts owned work, then returns a result that is not strict JSON
bugreadReport a bug to the Pi developers
calculatereadEvaluate mathematical expressions
calculatorreadPerform basic arithmetic operations
changelogreadShow changelog entries
classifyreadClassify images
cleardestructiveClear all messages
clonereadDuplicate the current session at the current position
compactreadManually compact the session context
constrainedreadA constrained tool
copyreadCopy last agent message to clipboard
countreadAdds to a counter kept in the session and returns the new value
custom-skillreadA custom skill
delegatereadDelegates
deletedestructiveDelete the last message
demoreadTest
deploywriteDeploy the application
deterministic_probereadMandatory benchmark tool. Call exactly once with the turn and marker from the user prompt.
double_numberreadDoubles a number and returns the result
drivereadDriven by the test
dummyreadDummy tool
duplicate-toolreadFirst
echoreadEcho input
echo_valuereadEcho a string value
editwriteEdit a file.
emitread
examplereadtool declaration
exportreadExport session (HTML default, or specify path: .html/.jsonl)
failreadAlways fails.
fanreadCall leaf in parallel
findreadFind files by pattern
fooreadbar
forkwriteCreate a new fork from a previous user message
get_circlereadReturns a circle image for visualization
get_circle_with_descriptionreadReturns a circle image with a text description
get_current_timereadGet the current date and time
grepreadSearch a file
helloreadCall the bundled Session worker facet
helpreadShow help
hidden-skillreadA hidden skill.
holdreadWaits
hotkeysreadShow all keyboard shortcuts
importwriteImport and resume a session from a JSONL file
injectedreadInjected skill
inspect_schemareadInspect the schema
latereadlate
late_toolreadlate_tool tool
laterreadFinishes first
leafreadReturn at once
linkedin_skillreadGet LinkedIn comments
listreadList a directory
load-skillsreadLoad skills
loginreadConfigure provider authentication
logoutdestructiveRemove provider authentication
lookupreadLook up a value
math_operationreadPerform basic arithmetic operations
mcp__docsreadSearch the product docs
mcp__docs__searchread
mcp__githubreadGitHub server
mcp__xreadKubernetes cluster tools
modelreadSelect model (opens selector UI)
models.listreadList models.
my-skillreadCustom project instructions
my-toolreadDashes
my_custom_toolreadA custom tool
my_toolreadShadowed
namewriteSet session display name
newwriteStart a new session
noopreadnoop
optionalreadOptional constrained sampling
ordinaryreadAn ordinary tool
pairreadpair
pingreadPing
preferredreadPreferred constrained tool
printreadPrints
probereadprobe
probe_firstreadUnused probe tool.
probe_secondreadUnused probe tool added on the second turn.
project-agentreadProject test agent
quitreadQuit ${APP_NAME}
readreadRead a file
read-filereaddashed
read_filereadunderscored
read_imagereadRead an image
read_issuereadRead one issue in full: status, labels, and body.
reloadreadReload keybindings, extensions, skills, prompts, themes, and context files
researchwriteStart a research subagent in the background. It searches while you keep talking with the user; its report arrives later as a message starting with [research report].
resumereadResume a different session
reviewreadReview template
sample_toolreadSample tool
scoped-modelswriteEnable/disable models for Ctrl+P cycling
scriptreadRead and classify images
searchreadSearch travel information about a city. Topics: weather, museums, trains. Slow; call several in parallel.
search_issuesreadKeyword search over the repository
secondreadsecond tool
sessionreadShow session info and stats
settingsreadOpen settings menu
sharereadShare session as a secret GitHub gist
share_toolreadRender a value for sharing
shotreadReturns an image.
skill-onereadFirst skill.
skill-tworeadSecond skill.
slowreadslow
spawnreadStarts owned work, then throws or hangs
stepsreadStreams three steps
strictreadStrict constrained sampling
subagentreadDelegate a self-contained task to a subagent with the same tools and get its answer back. Give it everything it needs to know; it does not see this conversation.
submit_planwriteSubmit the plan as a list of steps.
submit_triagewriteRecord the triage result. Call exactly once, as the last step.
t1readstrict tool
t2readnon-strict tool
tailreadPrints lines
testreadtest tool
test-skillreadA test skill.
test_toolreadA test tool
thinkingwriteSet thinking level
todowriteAdd an item to your todo list
todowritewriteWrite a todo item
treereadNavigate session tree (switch branches)
trustwriteSave project trust decision for future sessions
unrelatedreadunrelated
versionreadReport the tool
visible-skillreadA visible skill.
waitreadwait
writewriteWrite a file
xreada */ b
04

Trust audit

BLOCKgrade F · trust 39/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 (6 observation(s))
Network
declared (6 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/coding-agent/src/core/export-html/vendor/highlight.min.js:133
}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
packages/ai/src/providers/google-vertex.ts:6
const VERTEX_ADC_PATH = "~/.config/gcloud/application_default_credentials.json";
Why it matters. touches a credential store
MEDIUMInventory / provenance · inv.binary · CWE-1104
packages/tui/native/darwin/prebuilds/darwin-arm64/darwin-platform.node
darwin-platform.node
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.binary · CWE-1104
packages/tui/native/darwin/prebuilds/darwin-x64/darwin-platform.node
darwin-platform.node
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.binary · CWE-1104
packages/tui/native/linux/prebuilds/linux-arm64/linux-platform-x11.node
linux-platform-x11.node
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.binary · CWE-1104
packages/tui/native/linux/prebuilds/linux-x64/linux-platform-x11.node
linux-platform-x11.node
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInsecure crypto · crypto.weak_random · CWE-327, CWE-338
packages/ai/src/providers/faux.ts:291
const tokenSize = minTokenSize + Math.floor(Math.random() * (maxTokenSize - minTokenSize + 1));
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
packages/ai/src/auth/oauth/openrouter.ts:129
callback_url: callback.redirectUri,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
packages/ai/src/auth/oauth/openai-chatgpt.ts:25
const REDIRECT_URI = `http://127.0.0.1:${CALLBACK_PORT}${CALLBACK_PATH}`;
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/ai/test/github-copilot-anthropic.test.ts:87
const s = streamAnthropic(model, context, { apiKey: "tid_copilot_session_test_token" });
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/ai/test/github-copilot-anthropic.test.ts:120
apiKey: "tid_copilot_session_test_token",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/ai/test/google-vertex-api-key-resolution.test.ts:96
apiKey: "gcp-vertex-credentials",
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
clear, delete, logout
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.binary · CWE-1104
packages/coding-agent/examples/extensions/doom-overlay/doom/build/doom.wasm
doom.wasm
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/ai/test/bedrock-thinking-payload.test.ts
bedrock-thinking-payload.test.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
packages/coding-agent/examples/extensions/provider-payload.ts
provider-payload.ts
Why it matters. member named after an attack tool
Fix. remove or justify
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
packages/agent/test/utils/calculate.ts:12
const result = new Function(`return ${expression}`)();
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/ai/test/validation.test.ts:188
const generatedCheck = new Function(Compile(tool.parameters).Code())() as (value: unknown) => boolean;
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/codemode/test/sandbox.test.ts:716
new Function("return typeof process")(),
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/coding-agent/examples/extensions/doom-overlay/doom-engine.ts:65
const moduleFunc = new Function("module", "exports", "__dirname", "__filename", "require", doomJsCode);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/ai/test/total-tokens.test.ts:519
console.log(`\nXiaomi MiMo Token Plan CN / ${llm.id}:`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/ai/test/total-tokens.test.ts:544
console.log(`\nXiaomi MiMo Token Plan AMS / ${llm.id}:`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/ai/test/total-tokens.test.ts:569
console.log(`\nXiaomi MiMo Token Plan SGP / ${llm.id}:`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/ai/test/total-tokens.test.ts:594
console.log(`\nQwen Token Plan / ${llm.id}:`);
LOWInformation disclosure · disclose.log_secret · CWE-209, CWE-532
packages/ai/test/total-tokens.test.ts:619
console.log(`\nQwen Token Plan Individual / ${llm.id}:`);

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 4dcd6d34635cfull audit observations/trust-audit/mcp-server/earendil-works__pi.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-114dcd6d34635cBLOCKF39first audit
06

Questions

What is the @earendil-works/pi-mcp MCP server?

AI agent toolkit: unified LLM API, agent loop, TUI, coding agent CLI

What tools does @earendil-works/pi-mcp expose?

133 in total: 114 read-only, 16 that write, and 3 that can delete or overwrite (clear, delete, logout). Every one is listed on this page with its risk.

Is @earendil-works/pi-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (39/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. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does @earendil-works/pi-mcp need?

It reads ACME_STREAM_API_KEY, AI_GATEWAY_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_OAUTH_TOKEN, ANT_LING_API_KEY, AWS_ACCESS_KEY_ID, AWS_BEARER_TOKEN_BEDROCK, AWS_SECRET_ACCESS_KEY, AZURE_OPENAI_API_KEY, BASETEN_API_KEY and CEREBRAS_API_KEY 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 @earendil-works/pi-mcp run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @earendil-works/pi-tui at 1.1.0.

How current is this page?

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

Advertisement