Atlas / MCP servers / rafalpodles / board-planner

board-plannerBLOCK

mcp/rafalpodles/board-planner

One board. Your team works it. So do your agents. Kanban, sprints, REST API and MCP server — self-hosted, AGPL, with a PM agent and execution workers that run your tasks under your gates.

Verdict
BLOCK
Grade
F
Trust score
48 /100
Exposed tools
36 27r · 9w · 0d
Transport
—
License
AGPL-3.0
Stars
1
01

Overview

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

One board. Your team works it. So do your agents.

A Kanban board, sprints and a dashboard small teams can actually run — plus an MCP server and a REST API, so coding agents pick up the same tasks under the same rules as everybody else.

Most trackers bolt automation on: a bot posts a comment, a script moves a card, and the real state of the work lives somewhere the board cannot see. Board Planner starts from the other end. The board, the REST API and the MCP server are three doors into one model, with the same permission checks behind each. An agent moving a task to In Review passes the same status rules as a person dragging the card, and leaves the same trail in the same hi

Read from source at commit 3f8f8b4dcdb3OBSERVED · 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 board-planner-worker --env AI_MONTHLY_TOKENS=${AI_MONTHLY_TOKENS} --env AI_TRIAL_TOKENS=${AI_TRIAL_TOKENS} --env API_KEY=${API_KEY} --env BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "board-planner-worker": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AI_MONTHLY_TOKENS": "${AI_MONTHLY_TOKENS}",
        "AI_TRIAL_TOKENS": "${AI_TRIAL_TOKENS}",
        "API_KEY": "${API_KEY}",
        "BOOTSTRAP_TOKEN": "${BOOTSTRAP_TOKEN}"
      }
    }
  }
}
03

Exposed tools (36)

27 read · 9 write · 0 destructive.

ToolRiskDescription
Bareread
Boardread
Bugread
BuildsreadInstalls dependencies and builds the project.
Implementread
MergewriteMerges the pull request. Leave it out and a human decides.
NamereadDescription
Orbitread
ProposeswriteOpens a pull request for a person to merge.
PushwritePushes the branch to origin.
Reviewread
ReviewedreadA second model reads the change with no memory of writing it.
Runnableread
SizereadRefuses a change larger than the limit.
TalkativereadReads the task, writes a plan, implements it in small steps, runs the tests after each, opens a pull request and leaves a summary of every decision for the reviewer.
add_commentwrite
assign_taskread
change_statusread
create_narrow_gammawriteWrite a gamma record
create_taskwriteCreate a new task. Tasks are ALWAYS created in the project
get_board_digestreadScan the open board for tasks missing acceptance criteria or a description, tasks sitting in the same column for a long time, and likely duplicates by title. Heuristic — confirm with get_task before acting.
get_project_statsreadTask counts by status for the project.
get_taskreadGet full details of one task by key (e.g. CP-12).
list_commentsreadList comments on a task (newest last).
list_narrow_alphareadRead the alpha record
list_narrow_betareadRead the beta record
list_oauth_recordreadRead the record only a signed-in client may see
list_orphansread
list_tasksreadList tasks in the project (compact: key, title, status, assignee, priority; an epic also says how many of its children are done). Use get_task for full details.
list_thingreadfirst
notion-fetchreadRead one page
notion-searchreadVendor-prefixed, so not read-shaped to isReadSafe
notion-update-pagewriteAppend blocks to a page
search_pagesreadSearch pages in the workspace
update_pagewriteAppend blocks to a page
update_taskwriteUpdate a task
04

Trust audit

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

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

What the source does

Filesystem
declared (3 observation(s))
Network
none-observed
Shell
declared (7 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
worker/src/sandbox.ts:258
'(deny process-exec (literal "/bin/launchctl"))',
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
worker/src/sandbox.ts:263
'(deny process-exec (regex #"/watchman$"))',
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backup/test.sh:21
uri="mongodb://root:rootpw@bp965-mongo:27017/?authSource=admin"
HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
backup/test.sh:22
scratch="mongodb://root:rootpw@bp965-scratch:27017/?authSource=admin"
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/reseal-organisation-secrets.ts:28
console.log(`${apply ? "Resealed" : "Would reseal"} ${report.resealed} secret(s).`);
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
worker/src/__fixtures__/stream-success.ndjson:2
{"type":"assistant","message":{"model":"claude-sonnet-5","id":"msg_011CdeMN5WMGasEc88hb1DEx","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"<redacted>","signature":"ErsK
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
worker/src/scrub.test.ts:9
const ANTHROPIC_KEY = "sk-ant-api03-7Vd2mQx_pLr8Kt3NwZa5Yb1Ce6Hg9Jk4Ml0Op2Qs";
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
scripts/mongo-uri.test.ts:4
const INTERNAL = "mongodb://mongo:[email protected]:27017";
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
scripts/mongo-uri.test.ts:5
const TUNNEL = "mongodb://mongo:[email protected]:54321/?authSource=admin&directConnection=true";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
e2e/bounded-bodies.spec.ts:50
honest: { username: "someone", password: "a-long-enough-password", fullName: "Someone" },
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
e2e/invitations.spec.ts:76
async function accept(page: Page, link: string, username: string, password = "chosen-by-the-invitee") {
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
e2e/organisations-billing.spec.ts:281
const token = "cps_e2eac00fdeadbeefdeadbeefdeadbeef";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
e2e/project-audit-log.spec.ts:137
const TOKEN = "ghp_e2e_audit_never_in_the_log";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/app/api/users/[userId]/route.test.ts:261
const response = await PUT(put({ password: "a-brand-new-password" }), ctx());
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
src/lib/settings-audit.test.ts:77
["a token pasted on its own", "ghp_abcdefghijklmnopqrstuvwxyz0123456789", "(not a web address)"],
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
worker/src/decisions.test.ts:608
openPr: vi.fn().mockResolvedValue("https://x-access-token:[email protected]/o/r/pull/7"),
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
worker/src/decisions.test.ts:620
expect(said).not.toContain("ghp_0123456789abcdefghijklmnopqrstuvwxyz");
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
worker/src/reporter.test.ts:53
await createReporter(api, statuses).noted(task, "removed ghp_0123456789abcdefghijABCDEFGHIJ012345.test.js");
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
worker/src/reporter.test.ts:111
"https://x-access-token:[email protected]/o/r/pull/7",
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
worker/src/scrub.test.ts:250
"-----BEGIN OPENSSH PRIVATE KEY-----",
LOWInventory / provenance · inv.binary · CWE-1104
src/lib/next-path.test.ts
next-path.test.ts
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.binary · CWE-1104
src/lib/worker-user.test.ts
worker-user.test.ts
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.hidden_file · CWE-1104
.release-please-manifest.json
.release-please-manifest.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/app/oauth/authorize/consent-script.test.ts:79
new Function(script.textContent ?? "")();
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
worker/src/scrub.test.ts:373
const patch = "+PAYLOAD_KEY=eval(atob(ZXZpbA==));";
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 3f8f8b4dcdb3full audit observations/trust-audit/mcp-server/rafalpodles__board-planner.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-113f8f8b4dcdb3BLOCKF48first audit
06

Questions

What is the board-planner MCP server?

One board. Your team works it. So do your agents. Kanban, sprints, REST API and MCP server — self-hosted, AGPL, with a PM agent and execution workers that run your tasks under your gates.

What tools does board-planner expose?

36 in total: 27 read-only, 9 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is board-planner safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (48/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does board-planner need?

It reads AI_MONTHLY_TOKENS, AI_TRIAL_TOKENS, API_KEY, BOOTSTRAP_TOKEN, CP_API_TOKEN, DEMO_PASSWORD, E2E_LICENCE_PUBLIC_KEY, E2E_PASSWORDLESS_PORT, E2E_PASSWORDLESS_SERVER, ENCRYPTION_KEY, ENCRYPTION_KEYS_OLD and GITHUB_OAUTH_BASE_URL 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 current is this page?

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

Advertisement