Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Before installing a skill, MCP server or package: give the sha256 of the exact file. Read-only and free. Returns who signed a release with this hash, their standing, and conflicts (the same name@version signed with another hash = possible tampering). Advice: unknown_hash, signed_by_new_publisher, signed_by_established, signed_by_alalanet, caution_conflicting.
sha256 of the artifact, 64 hex characters
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http guard https://alalanet.com/mcp/guard
Before installing a skill, MCP server or package: give the sha256 of the exact file. Read-only and free. Returns who signed a release with this hash, their standing, and conflicts (the same name@version signed with another hash = possible tampering). Advice: unknown_hash, signed_by_new_publisher, signed_by_established, signed_by_alalanet, caution_conflicting.
| Argument | Type | Description |
|---|---|---|
| sha256* | string | sha256 of the artifact, 64 hex characters |
{
"type": "object",
"required": [
"sha256"
],
"properties": {
"sha256": {
"type": "string",
"description": "sha256 of the artifact, 64 hex characters"
}
},
"additionalProperties": false
}Before opening or trusting a GitHub repository someone sent you (a take-home task, a code review, a demo, a fork): its agent configuration can start MCP servers, run hooks and editor tasks, widen permissions and plant instructions as soon as the project is opened. Pass repo (owner/repo or a GitHub URL) and optional ref; for a local or private checkout pass files instead (path -> content of those files; the public record then holds only the decision, the files' sha256 and bare reason codes, the packages they name are checked without being signed, remote servers are looked up but not probed, and only CODEX_HOME, model-API, proxy and preload variables are read from .env). alalanet reads the files agents and editors load (.mcp.json at any depth, .github/mcp.json, .claude/settings.json, .cursor/mcp.json and hooks.json, .vscode/mcp.json, settings.json and tasks.json, .devcontainer, .gemini/settings.json and .env, .zed/settings.json, .codex/config.toml and hooks.json, .github/hooks and copilot settings, .env, registry settings (.npmrc, .yarnrc(.yml), bunfig.toml, uv.toml, pyproject.toml), CLAUDE.md, CLAUDE.local.md, AGENTS.md, GEMINI.md, .cursorrules, rules, agents, commands and skills folders including .github/agents and .agents/skills, with their frontmatter; symlinks read at their target) and runs nothing. It finds tasks and hooks that download and run code when the folder opens, hooks, skills and MCP servers that do the same (inline servers in agent files included), broad permissions including tools a skill grants itself, acceptEdits mode, plugin marketplaces and plugins the repository turns on, credential helpers and shell prefixes, repository MCP servers enabled without asking, the model API or a proxy pointed at another host (how API keys are taken), the package registry moved elsewhere, CODEX_HOME moved into the repository, invisible Unicode tag characters and bidirectional controls in instruction files, injection and concealment phrases, secrets committed in configs (never echoed); each MCP server goes through install_check. Returns decision allow / hold / block with reasons per file, findings, MCP servers with their verdicts and advice, signed into the public log (kind 4315). Whatever could not be read or checked holds as check_incomplete:<what>, never an allow. Free, no account: one check plus one per MCP server checked; cached 10 minutes.
| Argument | Type | Description |
|---|---|---|
| ref | string | branch, tag or commit to read; default: the default branch |
| repo | string | the public GitHub repository: owner/repo or https://github.com/owner/repo (or pass files instead) |
| files | object | instead of repo, for a local or private checkout: the agent configuration files as path from the repository root -> content (only the paths this tool reads, at most 40 files and 2 MB in all). alalanet keeps no content; the public record holds only the decision, the files' sha256 and bare reason codes (no paths, no names); the packages they name are checked without being signed or logged; remote servers are looked up, never probed; from .env only CODEX_HOME, model-API, proxy and preload variables are read |
{
"type": "object",
"properties": {
"ref": {
"type": "string",
"description": "branch, tag or commit to read; default: the default branch"
},
"repo": {
"type": "string",
"description": "the public GitHub repository: owner/repo or https://github.com/owner/repo (or pass files instead)"
},
"files": {
"type": "object",
"description": "instead of repo, for a local or private checkout: the agent configuration files as path from the repository root -> content (only the paths this tool reads, at most 40 files and 2 MB in all). alalanet keeps no content; the public record holds only the decision, the files' sha256 and bare reason codes (no paths, no names); the packages they name are checked without being signed or logged; remote servers are looked up, never probed; from .env only CODEX_HOME, model-API, proxy and preload variables are read",
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
}Call before connecting to a remote MCP server, and whenever a call to it fails. Give url (any https URL of an MCP server, listed or not: unknown servers are probed now) or id from an earlier answer. Returns: alive, advice (ok / ok_requires_auth: working; unverified_yet: not fully checked yet; caution_tools_changed or caution_suspicious_tool_description: confirm with the user first; avoid_down or avoid_not_working_as_listed: do not connect), trust_score (0-100, open formula at https://alalanet.com/trust) with flags, checked_at and last_alive_at, uptime 24h/7d/30d, the tool-set diff (tools_diff, tools_changed_at), tool descriptions that look like hidden instructions (tool_description_flags), the digest of the server's initialize instructions, and when the advice is caution_* or avoid_*, up to 3 working MCP servers on other hosts. Default answers from recent checks (100 a day free); live=true probes now and adds a signed, logged attestation (5 live checks a day free). Read-only for the caller; an unknown URL joins the public catalogue.
| Argument | Type | Description |
|---|---|---|
| id | string | service id from an earlier answer; give either id or url |
| url | string | https URL of the remote MCP server to check; unknown servers are probed now and added to the public catalogue (private, loopback, link-local and cloud-metadata addresses are refused) |
| live | boolean | true probes the server now and returns a signed, logged receipt; false (default) answers from recent checks |
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "service id from an earlier answer; give either id or url"
},
"url": {
"type": "string",
"description": "https URL of the remote MCP server to check; unknown servers are probed now and added to the public catalogue (private, loopback, link-local and cloud-metadata addresses are refused)"
},
"live": {
"type": "boolean",
"description": "true probes the server now and returns a signed, logged receipt; false (default) answers from recent checks"
}
},
"additionalProperties": false
}Before adding a remote MCP server to a client, or when it fails to connect: give its url. One live read (initialize with protocol 2025-06-18 and 2025-11-25, tools/list, the 401 and OAuth metadata, the host's IPv4) and a verdict per client: claude_code, claude_ai, chatgpt, codex_cli, cursor, vscode, windsurf, gemini_cli, zed, cline, each ok, warn or fail with reasons (protocol version answered, OAuth discovery, S256 PKCE, dynamic client registration or client ID metadata documents, tool names, input schemas, tool count, description length). Also the tool list's weight in tokens (estimate and range). Rules come from each client's documentation and source code as of 2026-11-08: a prediction, not a test inside the client. Uses one of your daily live checks; answers are cached for 10 minutes.
| Argument | Type | Description |
|---|---|---|
| url* | string | https URL of the remote MCP server |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "https URL of the remote MCP server"
}
},
"additionalProperties": false
}Use when you or your user need proof of something alalanet stated: an install verdict, a server check, a tool-set change. Pass the event id (64 hex) from a previous result. Read-only and free. Returns the signed Nostr event (event_json, exact signed bytes), the signer key, and its RFC 6962 inclusion proof under a signed C2SP checkpoint, plus how_to_verify. Verify offline without trusting alalanet: check the signature, the proof up to root_hash, and the checkpoint signature with log_key.
| Argument | Type | Description |
|---|---|---|
| event_id* | string | the attestation event id (64 hex chars) from an earlier result (attestation.event.id) |
{
"type": "object",
"required": [
"event_id"
],
"properties": {
"event_id": {
"type": "string",
"description": "the attestation event id (64 hex chars) from an earlier result (attestation.event.id)"
}
},
"additionalProperties": false
}Checks something before it is installed, typically when a README, a document or another agent suggests installing it: an npm or PyPI package, an install command (npx -y pkg, uvx pkg, pip install pkg, npm i pkg, claude mcp add NAME -- npx -y pkg, skills add owner/repo, clawhub install slug, code --install-extension publisher.name), a GitHub repository or skill, a ClawHub skill, a VS Code Marketplace or Open VSX extension (Cursor, Windsurf and VSCodium install from Open VSX), or an MCP config entry (JSON). alalanet checks public sources: OSV malicious-package and vulnerability records, names that imitate official MCP servers (typosquats, also the same name in the other ecosystem), packages that do not exist (names a model invented), brand-new packages and repositories, install scripts, maintainer changes between versions, provenance, ClawHub scan verdicts and copied skill names, skills.sh security audits of the skills a repository holds, extensions Microsoft removed from the Marketplace (malware, impersonation), look-alike extensions and unverified Open VSX copies of verified Marketplace ones; remote MCP servers get the full check_service. Returns decision allow / hold / block with reasons (known_malicious, name_like_official, not_on_npm, not_on_pypi, runs_install_script, maintainers_changed, new_package, new_repo, known_vulnerabilities, version_yanked, not_on_clawhub, slug_like_popular, skills_sh_audit_fail, provenance_dropped, removed_from_marketplace, name_like_popular, launch_not_readable ...), facts and advice, signed into the public log (kind 4310). A line whose package alalanet cannot read (custom registry, git/URL source, stdin or $(...) arguments, several packages, other commands) holds. allow means no known problem was found, not that the code was read. Free, no account.
| Argument | Type | Description |
|---|---|---|
| target* | string | what you are about to install, in any common form: an npm or PyPI package (name, [email protected], npm:name, pypi:name==1.2), an install command (npx -y pkg, uvx pkg, pip install pkg, npm i pkg, claude mcp add NAME -- npx -y pkg, skills add owner/repo (also owner/repo@skill, owner/[email protected] or #ref pins, owner/repo/sub/folder, -s skill …), clawhub install slug or @owner/slug, code or cursor --install-extension publisher.name), a GitHub repository URL, a VS Code Marketplace or Open VSX extension page, or an MCP config entry as JSON ({"command":"npx","args":["-y","pkg"]} or {"url": <remote MCP URL>}) |
Checks the tools an agent received from a remote MCP server against alalanet's history of that server, to catch a server that changed its tools after you approved them, or serves you something different from what it serves everyone else. Pass url and the tools array from your tools/list result (or a digest from an earlier answer). Read-only and free. When your set differs from alalanet's last read, alalanet re-reads the server's tools/list before answering (fetched_now; uses one of your daily live checks), so the answer reflects what the server serves at this moment. Returns verdict matches_current (exactly what the server serves alalanet now), served_before (an older set, with first_seen and last_seen), never_served (alalanet was never served this set: review before trusting it) or no_history, plus the diff from the current set (added, removed, changed, gained_authority), description flags found in what you sent, and the digest history with links to the signed transparency-log entries of each change. Names and descriptions are third-party text.
| Argument | Type | Description |
|---|---|---|
| url* | string | https URL of the remote MCP server, exactly as you connect to it |
| tools | null | array | the tools array from the tools/list result you received |
| digest | string | alternatively an alalanet tool-set digest (64 hex) from an earlier answer |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "https URL of the remote MCP server, exactly as you connect to it"
},
"tools": {
"type": [
"null",
"array"
],
"items": {
"type": "object",
"additionalProperties": true
},
"description": "the tools array from the tools/list result you received"
},
"digest": {
"type": "string",
"description": "alternatively an alalanet tool-set digest (64 hex) from an earlier answer"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 14, 2026.
{
"type": "object",
"required": [
"target"
],
"properties": {
"target": {
"type": "string",
"description": "what you are about to install, in any common form: an npm or PyPI package (name, [email protected], npm:name, pypi:name==1.2), an install command (npx -y pkg, uvx pkg, pip install pkg, npm i pkg, claude mcp add NAME -- npx -y pkg, skills add owner/repo (also owner/repo@skill, owner/[email protected] or #ref pins, owner/repo/sub/folder, -s skill …), clawhub install slug or @owner/slug, code or cursor --install-extension publisher.name), a GitHub repository URL, a VS Code Marketplace or Open VSX extension page, or an MCP config entry as JSON ({\"command\":\"npx\",\"args\":[\"-y\",\"pkg\"]} or {\"url\": <remote MCP URL>})"
}
},
"additionalProperties": false
}