Palinode MCP Server

palinode PyPI v0.9.5

Published by phasespace-labs — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.

Trust grade
D
67/100
Last scanned
Trust
D · 67/100
Adoption risk for you: the threat score, then adjusted down for blast radius, publisher verification and how much the scan could see. Deterministic; every point is auditable.
Capability
Critical
Blast radius if it went rogue — what the server’s tools could reach. Independent of trust.
Coverage
Source
How much the scan could actually inspect. Shallow coverage is stated, never hidden.
D Why this grade threat 78 − adoption risk = 67/100

The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.

1. Threat score — 100 − 22 = 78. What the published surface and source actually contain:

PointsWhat was foundCategory
−22 Hardcoded AWS access key id in server code MTC-SRC-008 exfiltration

2. Client adoption risk — 78 − 11 = 67. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:

PointsAdoption-risk factor
−10 capability blast radius (critical) — client exposure if the model is manipulated
−1 publisher verification (public source) — no provenance, but the source is public and inspectable
inspection depth (source) — how much of the target the scan could see

Grade capped: 1 confirmed high finding → grade capped at C. A hard gate overrides the point total — no amount of clean surface buys back a confirmed catastrophe.

Capability observations and info notes are shown under Findings but never scored. Open any row's finding below for the file, line and evidence behind a deduction.

Findings 23

critical Completed toxic-flow trifecta across toolsMTC-FLOW-002

This server (without client built-ins) exposes a complete data-exfiltration chain: palinode_ingest → palinode_archive ⇒ palinode_ingest. Untrusted input is ingested, private data is read, and it can be sent to an external sink — and at least one leg is a direct schema wire (⇒), where a producer's output drops straight into a free-text parameter of the next tool, so the chain needs little agent cooperation. Static analysis proves the primitive exists, not that a specific run will occur.

Fix: Remove one leg of the trifecta: isolate untrusted-input tools from secret-reading tools and from egress tools, or require human approval between them.

Location: flow palinode_ingest → palinode_archive → palinode_ingest

high Hardcoded AWS access key id in server code (tests/test_security_log_redaction.py)MTC-SRC-008

A live-looking AWS access key id is hardcoded in `tests/test_security_log_redaction.py:50`. Secrets in source ship to everyone who installs the package and are a direct credential leak.

Evidence: AWS access key id: AKIA…(redacted)

Fix: Remove the secret, rotate it, and load credentials from the environment or a secret store.

Location: server tests/test_security_log_redaction.py

high Shell/command execution in server code (palinode/api/routers/health.py)MTC-SRC-002

In the server's implementation (`palinode/api/routers/health.py:72`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/api/routers/health.py

high Shell/command execution in server code (palinode/api/routers/memory.py)MTC-SRC-002

In the server's implementation (`palinode/api/routers/memory.py:781`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/api/routers/memory.py

high Shell/command execution in server code (palinode/cli/__init__.py)MTC-SRC-002

In the server's implementation (`palinode/cli/__init__.py:211`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/cli/__init__.py

high Shell/command execution in server code (palinode/cli/mcp_smoke.py)MTC-SRC-002

In the server's implementation (`palinode/cli/mcp_smoke.py:114`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/cli/mcp_smoke.py

high Shell/command execution in server code (palinode/cli/worktree.py)MTC-SRC-002

In the server's implementation (`palinode/cli/worktree.py:36`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/cli/worktree.py

high Shell/command execution in server code (palinode/consolidation/write_time.py)MTC-SRC-002

In the server's implementation (`palinode/consolidation/write_time.py:462`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/consolidation/write_time.py

high Shell/command execution in server code (palinode/core/git_tools.py)MTC-SRC-002

In the server's implementation (`palinode/core/git_tools.py:49`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: shell=True

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/core/git_tools.py

high Shell/command execution in server code (palinode/diagnostics/checks/git_remote.py)MTC-SRC-002

In the server's implementation (`palinode/diagnostics/checks/git_remote.py:29`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/diagnostics/checks/git_remote.py

high Shell/command execution in server code (palinode/diagnostics/checks/watcher.py)MTC-SRC-002

In the server's implementation (`palinode/diagnostics/checks/watcher.py:53`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/diagnostics/checks/watcher.py

high Shell/command execution in server code (palinode/ingest/pipeline.py)MTC-SRC-002

In the server's implementation (`palinode/ingest/pipeline.py:129`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.

Evidence: subprocess.run(

Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.

Location: server palinode/ingest/pipeline.py

medium Unconstrained URL/host parameter "url" on "palinode_ingest"MTC-CAP-007

Tool "palinode_ingest" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).

Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.

Location: tool palinode_ingest · inputSchema.properties.url

low Unconstrained path parameter "file_path" on "palinode_read"MTC-CAP-008

Tool "palinode_read" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_read · inputSchema.properties.file_path

low Unconstrained path parameter "file_path" on "palinode_history"MTC-CAP-008

Tool "palinode_history" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_history · inputSchema.properties.file_path

low Unconstrained path parameter "file_path" on "palinode_timeline"MTC-CAP-008

Tool "palinode_timeline" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_timeline · inputSchema.properties.file_path

low Unconstrained path parameter "file_path" on "palinode_archive"MTC-CAP-008

Tool "palinode_archive" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_archive · inputSchema.properties.file_path

low Unconstrained path parameter "file_path" on "palinode_blame"MTC-CAP-008

Tool "palinode_blame" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_blame · inputSchema.properties.file_path

low Unconstrained path parameter "file" on "palinode_blame"MTC-CAP-008

Tool "palinode_blame" takes a path parameter "file" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_blame · inputSchema.properties.file

low Unconstrained path parameter "file_path" on "palinode_trace"MTC-CAP-008

Tool "palinode_trace" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_trace · inputSchema.properties.file_path

low Unconstrained path parameter "file_path" on "palinode_rollback"MTC-CAP-008

Tool "palinode_rollback" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_rollback · inputSchema.properties.file_path

low Unconstrained path parameter "file" on "palinode_rollback"MTC-CAP-008

Tool "palinode_rollback" takes a path parameter "file" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_rollback · inputSchema.properties.file

low Unconstrained path parameter "file_path" on "palinode_cluster_neighbors"MTC-CAP-008

Tool "palinode_cluster_neighbors" takes a path parameter "file_path" with no constraint. Without a canonicalize-and-contain check (not visible statically), this permits ../ traversal outside the intended root.

Fix: Resolve and verify the path stays within an allowed root; reject traversal sequences.

Location: tool palinode_cluster_neighbors · inputSchema.properties.file_path

Toxic flows 1

Cross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).

What this scan could not see

Versions

Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.

VersionScoreFindingsEngineScanned
v0.9.5 latest D 67/100 23 1.7.0 2026-07-23

Embed this score

Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.

MCP Trust Score: D · 67/100
Markdown (GitHub README)
[![MCP Trust Score](https://mcptrustchecker.com/registry/palinode/badge.svg)](https://mcptrustchecker.com/registry/palinode)
HTML
<a href="https://mcptrustchecker.com/registry/palinode"><img src="https://mcptrustchecker.com/registry/palinode/badge.svg" alt="MCP Trust Score" height="20"></a>
Prefer shields.io styling? Point it at https://mcptrustchecker.com/registry/palinode/badge.json via https://img.shields.io/endpoint?url=…

Verify this score yourself

The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.

npx mcptrustchecker scan palinode --online --registry pypi

Use the free API → How scoring works

More in Developer Tools