MCP
Neram MCP — local stdio and hosted Streamable HTTP, same tools.
Local stdio and hosted Streamable HTTP run the same Organization-scoped tools. Transport is stateless Streamable HTTP (no session); the server validates Mcp-Method/Mcp-Name routing headers against the request body. The SDK negotiates protocol versions through 2025-11-25; full 2026-07-28 (server/discover, MRTR, Tasks) is a planned SDK v2 migration. Tool failures come back as isError results (not protocol exceptions) with stable error codes.
Local stdio
Sign in with neram login so tool calls can reach your workspace. neram mcp starts and completes the handshake even when you aren't logged in — it never auto-logs-in from startup and never exits over auth. The first tool call then returns an isError result with UNAUTHENTICATED; the server refreshes the token per request.
npx neram login # sign in first
npx neram mcp # stdio server; handshake even without a session
npx neram mcp list --json # list tools, resources, prompts without a client
# print a client config without writing files (also: cursor, vscode, opencode, goose)
npx neram mcp install claude-code
# write it directly (opt-in; default stays print-only)
npx neram mcp install cursor --write --merge
# local Streamable HTTP for Inspector testing
npx neram mcp serve --port 3030
# Claude Code one-liner
claude mcp add neram -- npx neram mcp{
"mcpServers": {
"neram": {
"command": "npx",
"args": ["neram", "mcp"]
}
}
}Hosted Streamable HTTP
# hosted Streamable HTTP; send a Clerk id_token
curl -s https://neram.praveenjuge.com/mcp \
-H "Authorization: Bearer $NERAM_ID_TOKEN"Send a Clerk OAuth id_token in Authorization: Bearer <id_token>. The endpoint returns 401 without a bearer token (with WWW-Authenticate: Bearer resource_metadata=".../.well-known/oauth-protected-resource", scope="..." per RFC 9728); that is the expected unauthenticated smoke-test result. GET /mcp is an unauthenticated discovery probe. Public client config is at /.well-known/neram-agent.json; protected-resource metadata at /.well-known/oauth-protected-resource.
Resources
# static (application-driven context)
neram://workspace/status
neram://sprint/current
neram://projects
neram://brief/daily
# templates
neram://project/{id}
neram://task/{id}Prompts
plan-sprint # triage Backlog into the active Sprint
daily-standup # assigned work + next actions in 5 bullets
project-retro # counts, done vs open, stalest work
triage-capture # capture into the right projectDestructive confirmations
delete_project, delete_workspace, end_sprint, and delete_task with children require their explicit confirm* args. Pass the flags; the server does not elicit mid-call confirmation or return task handles (MRTR/tasks support is deferred).
Tools
# read-only
daily_brief
workspace_status
get_workspace
list_workspace_members
get_sprint
list_sprint_tasks
sprint_history
list_projects
list_tasks
get_task
list_subtasks
list_task_comments
summarize_project
recent_activity
# mutations
capture_task
update_task
move_task # optional position for kanban order
complete_task
move_task_to_project
delete_task
create_subtask
rename_subtask
set_subtask_completed
reorder_subtask
delete_subtask
create_comment
reply_to_comment
edit_comment
delete_comment
create_project
update_project
delete_project # destructive — purges every task
create_workspace
invite_workspace_member
update_workspace_member_role
remove_workspace_member # destructive — exact Organization confirmation
delete_workspace # destructive — exact Organization confirmation
plan_sprint_tasks
remove_sprint_tasks
update_sprint_goal
update_sprint_duration
start_sprint
end_sprint # destructive — unfinished work returns to Backlog
# failures return isError results with:
# { error: { code, message, details } }IDs vs names
Prefer project and task ids for automation; name/title resolution intentionally rejects ambiguous matches with AMBIGUOUS and candidate ids in details.matches.