mcporterBLOCK
Call MCPs via TypeScript, masquerading as simple TypeScript API. Or package them as cli.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://github.com/openclaw/mcporter/actions/workflows/ci.yml) [](https://www.npmjs.com/package/mcporter) [](https://nodejs.org) [](LICENSE) [](https://mcporter.sh)
MCPorter is a TypeScript runtime and command-line tool for discovering and calling Model Context Protocol servers. It is for developers and coding agents that need the same MCP tools from a terminal, a script, or a generated standalone CLI.
Install
Try the CLI without installing it:
npx mcporter --version
Install it for repeated command-line use:
brew install steipete/tap/mcporter # or npm install -g mcporter
Node 24 or newer is required for npm installs. For the TypeScript runtime, add mcporter to your project with your package manager. Signed macOS binaries and the other supported install paths are covered in the install guide.
Quick start
Inspect a public MCP server, then call one of its tools:
npx mcporter list https://mcp.context7.com/mcp --brief npx mcporter call https://mcp.context7.com/mcp.resolve-library-id \ query="React hooks docs" libraryName=react
The first command prints the server's TypeScript-style tool signatures. The second returns matching Context7 library IDs without requiring local configuration or credentials. See the five-minute quickstart for resources, generated CLIs, and typed clients.
Core workflows
4ca6a923d35eOBSERVED · 2026-10-12Connect
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 mcp add test-server-modern --env CLIENT_SECRET=${CLIENT_SECRET} --env CONTEXT7_API_KEY=${CONTEXT7_API_KEY} --env FIXTURE_TOKEN=${FIXTURE_TOKEN} --env INLINE_TOKEN=${INLINE_TOKEN} -- npx -y @mcporter/[email protected]{
"mcpServers": {
"test-server-modern": {
"command": "npx",
"args": [
"-y",
"@mcporter/[email protected]"
],
"env": {
"CLIENT_SECRET": "${CLIENT_SECRET}",
"CONTEXT7_API_KEY": "${CONTEXT7_API_KEY}",
"FIXTURE_TOKEN": "${FIXTURE_TOKEN}",
"INLINE_TOKEN": "${INLINE_TOKEN}"
}
}
}
}Exposed tools (109)
98 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.
| Tool | Risk | Description |
|---|---|---|
API-post-page | write | Create a Notion page |
add | write | |
add-numbers | write | Add two numbers |
admin_reset | destructive | |
alpha | read | keep alive server |
alpha-long | read | keep alive server |
alpha__ping | read | Tool from MCPorter server |
annotated | read | Expose all stable 2025 tool annotations. |
array-object-test | read | Array object test |
array-test | read | Array coercion test |
array_tool | read | |
ask | read | |
beta | read | ephemeral server |
big | read | |
browser.navigate | read | Navigate the browser |
cached | read | |
calculator | read | Math tools |
case-options | read | Case options test |
check_login_status | read | |
chrome-devtools | read | Chrome DevTools MCP server |
click | read | Click an element |
complete | read | Complete definition |
confirm_delete | destructive | |
context7 | read | Context7 documentation MCP |
create_comment | write | Create a comment on a specific Linear issue |
create_entities | write | |
delayed | read | |
demo | read | Demo server |
demo_tool | read | Demo tool |
deploy | write | |
deterministic-bundle | read | Deterministic bundle integration server |
doctor | read | Runs diagnostics |
echo | read | |
echo_text | read | |
elicit_name | read | Ask the client for a name using form elicitation. |
evaluate_script | read | Evaluate a function on a page |
example | read | Test |
fail | read | |
fake | read | Fake HTTP server |
fetch | read | Fetch a URL |
firecrawl | read | |
fixture | read | ${fixture} committed fixture |
generated-daemon | read | Generated daemon test server |
held | read | |
held_write | write | |
http-server | read | A test server |
identity | read | |
immich | read | Immich MCP |
integration | read | Integration test server |
integration-mjs | read | MJS bundle integration server |
legacy | read | Legacy test server |
linear | read | Linear MCP |
linear-cli | read | Issue tools |
list_comments | read | List comments for an issue |
list_documents | read | List documents in the user |
list_entities | read | |
list_files | read | |
list_pages | read | List open pages |
list_projects | read | List Vercel projects |
log_spam | read | Emit logging notifications at several levels. |
long_task | read | Emit deterministic progress notifications before completing. |
lookup | read | Lookup documentation entries |
mcp-sentry-dev-mcp | read | Ad-hoc Sentry |
my-service | read | Example |
next_value | read | |
note | read | Note a time |
object-test | read | Object parsing test |
object_tool | read | |
obsidian | read | Local Obsidian bridge |
one | read | |
option_case_test | read | |
ping | read | |
plain_text | read | |
qs-demo | write | Quick start demo |
raw-required-test | read | Raw required test |
read_text_file | read | |
recorded-tool | read | Replay fixture tool |
runtime_tool | read | A dynamically registered fixture tool. |
safe_tool | read | */ } globalThis.docInjected = true; interface Reopened { /* |
sample_poem | read | Ask the client to sample a short poem. |
search | read | Search pages |
search_issues | read | Search issues |
set_cells_batch | write | |
shadcn | read | shadcn/ui registry MCP |
subtract | read | Subtract numbers |
summarize | read | Summarize content |
take_snapshot | read | Takes a snapshot. |
temp | read | test |
test-oauth | read | Test OAuth server |
test-oauth-env-no-browser | read | Test OAuth server |
test-oauth-env-no-browser-falsy | read | Test OAuth server |
test-oauth-headless-url | read | Test OAuth server |
test-oauth-isolated-home | read | Test OAuth server |
test-oauth-no-browser-url | read | Test OAuth server |
test-oauth-read-failure | read | Test OAuth server |
test-oauth-repeat-redirect | read | Test OAuth server |
test-oauth-scope | read | Test OAuth server |
test-oauth-singleflight | read | Test OAuth server |
test-oauth-stale-client | read | Test OAuth server |
test-oauth-static-client | read | Test OAuth server |
test-oauth-wait-before-redirect | read | Test OAuth server |
throw | read | Raise a JSON-RPC protocol error. |
toggle_tool | read | Toggle a runtime-registered tool and emit list_changed. |
tool-alias-test | read | Tool alias test |
touch_resource | read | Notify subscribers that the mutable resource changed. |
use_sentry | read | Proxy to Sentry |
vercel | read | |
whoami | read | |
xhs.check_login_status | read |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (11 observation(s))
- Network
- declared (6 observation(s))
- Shell
- declared (4 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (25)
exec(
if (token === '--allow-http' || token === '--insecure') {admin_reset, confirm_delete
.crabbox.yaml
.mac-release.env.example
.oxfmtrc.json
.oxlintrc.json
const expectedAccept = createHash('sha1').update(`${websocketKey}${WEBSOCKET_GUID}`).digest('base64');const accept = createHash('sha1').update(`${key}${WEBSOCKET_GUID}`).digest('base64');const accept = createHash('sha1').update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`).digest('base64');const WEBSOCKET_ACCEPT = createHash('sha1')const accept = createHash('sha1').update(`${websocketKey}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`).digest('base64');import { OAuthRequestedScopeSchema } from '../../config-schema.js';import { writeRawConfig, type LoadConfigOptions, type RawEntry } from '../../config.js';import { pathsForImport, readExternalEntries } from '../../config-imports.js';import { expandHome } from '../../env.js';import { withFileLock } from '../../fs-json.js';Set persistent controls as literal values in the existing Chrome definition’s `env` map in `~/.mcporter/mcporter.json` (or `.jsonc` when no `.json` exists), alongside `chromeDevtoolsRelay: "require"`.
CHROME_DEVTOOLS_MCP_BROWSER_URL=http://127.0.0.1:9222 \
return { baseUrl: new URL(`http://127.0.0.1:${address.port}/mcp`), httpServer };['sh', ['-c', 'chrome-devtools-mcp --browserUrl=http://127.0.0.1:9222']],
['redirect', 'HTTP/1.1 302 Found\r\nLocation: http://127.0.0.1:9/\r\nContent-Length: 0\r\n\r\n'],
it('accepts --insecure as a hidden alias for --allow-http', () => {const args = ['--http-url', 'http://mcp.example.com/mcp', '--insecure'];
@iarna/toml, @modelcontextprotocol/client, @modelcontextprotocol/server, acorn, commander, es-toolkit, jsonc-parser, ora
Gates applied: no_behavioural_pass.
4ca6a923d35efull audit observations/trust-audit/mcp-server/openclaw__mcporter.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 4ca6a923d35e | BLOCK | D | 69 | first audit |
Questions
What is the mcporter MCP server?
Call MCPs via TypeScript, masquerading as simple TypeScript API. Or package them as cli.
What tools does mcporter expose?
109 in total: 98 read-only, 9 that write, and 2 that can delete or overwrite (admin_reset, confirm_delete). Every one is listed on this page with its risk.
Is mcporter safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/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: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does mcporter need?
It reads CLIENT_SECRET, CONTEXT7_API_KEY, FIXTURE_TOKEN, INLINE_TOKEN, LINEAR_API_KEY, MCPORTER_OAUTH_NO_BROWSER, MCPORTER_TEST_OAUTH_CACHE_DIR, MCPORTER_TEST_OAUTH_ENDPOINT, MCPORTER_TEST_OAUTH_MARKER_KEY, MCPORTER_TEST_OAUTH_SECRET, MCPORTER_TEST_OAUTH_SEED_REFRESH and MCPORTER_TEST_OAUTH_SERVER_NAME 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 mcporter run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @mcporter/test-server-modern at 0.0.0.
How current is this page?
The grade is for one exact copy of the source (4ca6a923d35e), read on 2026-10-12. The repository is watched and re-audited when it changes.