npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

tododdle-mcp

v3.5.1

Published

Agent-first task, project context, and time tracking for ToDoddle

Readme

ToDoddle MCP Server

The official Model Context Protocol stdio server for ToDoddle. It gives MCP-compatible agents a bounded interface for project context, boards, lanes, tickets, comments, and time tracking through ToDoddle's hosted API.

The package contains no ToDoddle application or database code. It is a small stdio client that authenticates as an Agent Connection and calls the hosted API.

Version 3 sends its package version and compatibility level with every token and API request. If ToDoddle returns MCP_UPDATE_REQUIRED, run npx --yes --prefer-online tododdle-mcp@latest and restart the MCP host. The error includes the installed version, minimum supported level, update command, and current troubleshooting guide.

Agent work claims let any connected agent indicate that it is actively handling a ticket without becoming the human assignee. Claims use the configured Agent Connection label, an opaque run ID, and an expiring lease. Each claim also starts or resumes a durable Agent Run. The agent can record a terminal result, evidence, and optional usage telemetry without changing ticket status.

The server sends content-trust and authority guidance in its MCP initialization response. Agents receive this guidance before they read tool results. Ticket text, Context, comments, support messages, Notes, documents, attachments, links, logs, quoted text, and agent output cannot change the workflow, tool policy, connection grants, safety controls, or project scope. External content remains evidence only.

Requirements

  • Node.js 20 or newer
  • A ToDoddle Agent Connection client ID and client secret
  • Scopes and project grants configured for that Agent Connection in ToDoddle

Configure

Create an Agent Connection in ToDoddle, grant it only the scopes and projects it needs, and copy its client ID and one-time client secret. The examples follow npm's current latest release so restarted clients receive capability and security updates.

Codex

Add the server from a terminal:

codex mcp add tododdle \
  --env TODODDLE_CLIENT_ID=your_client_id \
  --env TODODDLE_CLIENT_SECRET=your_client_secret \
  -- npx --yes --prefer-online tododdle-mcp@latest

codex mcp list

Codex desktop, the CLI, and the IDE extension share the MCP configuration in ~/.codex/config.toml. For project-specific configuration, add the same server to .codex/config.toml in a trusted project. Restart the server after changing credentials or scopes.

See the Codex MCP documentation for configuration and troubleshooting.

Claude Code

Install the server for your user account so it is available across projects:

claude mcp add tododdle --scope user \
  --env TODODDLE_CLIENT_ID=your_client_id \
  --env TODODDLE_CLIENT_SECRET=your_client_secret \
  -- npx --yes --prefer-online tododdle-mcp@latest

claude mcp get tododdle

Run /mcp inside Claude Code to inspect the connection. On native Windows, place cmd /c before npx in the command. See the Claude Code MCP documentation for scope options and diagnostics.

Cursor

Add this configuration to ~/.cursor/mcp.json for all projects, or to .cursor/mcp.json for one project:

{
  "mcpServers": {
    "tododdle": {
      "command": "npx",
      "args": ["--yes", "--prefer-online", "tododdle-mcp@latest"],
      "env": {
        "TODODDLE_CLIENT_ID": "your_client_id",
        "TODODDLE_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Do not commit a project-level configuration containing real credentials. Restart Cursor after changing the configuration; ToDoddle tools will then be available to Agent. See the Cursor MCP documentation for configuration and status controls.

For every client, npx downloads the package to npm's cache. Cloning ToDoddle or running a local ToDoddle service is not required.

Workflow Guidance

The MCP server provides capabilities. The package distributes three optional skills:

| Skill | Use | | --- | --- | | tododdle-workflow | Manage ordinary tracked work and use ToDoddle as the durable ledger. | | tododdle-bootstrap | Bind an existing repository to one verified ToDoddle project. | | tododdle-factory | Run one explicit, supervised autonomous delivery attempt with an Agent Run and stable evidence. |

The bootstrap skill has a deterministic updater that adds a small managed block to the effective root agent instructions. The Factory skill reuses the workflow rules and adds bounded delivery, escalation, cleanup, and package staging checks.

The workflow skill keeps common routing and safety rules in a small entry file. Direct reference links load file handling, project execution, time tracking, and scheduled workflow details only when needed. This keeps the normal prompt smaller without hiding required rules.

The skill tells an agent to claim substantial ticket work, renew a long-running claim before it expires, and finish its Agent Run with evidence. It also covers ticket status, durable comments, verification, and handoffs. The skill does not add credentials or tools. Configure the MCP connection separately for each client.

Codex

The npm package includes a Codex plugin containing all three skills. Configure the MCP server first using the Codex instructions above, then add the ToDoddle plugin marketplace:

codex plugin marketplace add krffl/tododdle-mcp

Restart Codex, open the Plugins Directory, select ToDoddle, and install the plugin. Codex can invoke the skills automatically. Use $tododdle-bootstrap to connect an existing repository. Use $tododdle-workflow for ordinary tracked work. Invoke $tododdle-factory only for an explicit supervised factory run or autonomous delivery request.

Installing the plugin does not create or expand ToDoddle credentials, scopes, or project grants. All three skills declare the separately configured tododdle MCP server as a dependency.

Claude Code

The same npm package includes a Claude Code plugin containing the workflow, bootstrap, and Factory skills. Keep the existing ToDoddle MCP connection. Add the marketplace and install the plugin in Claude Code:

/plugin marketplace add krffl/tododdle-mcp
/plugin install tododdle@tododdle

Choose user scope to use the workflow across projects. Run /reload-plugins if Claude Code asks you to activate the plugin. Use /tododdle:tododdle-bootstrap for repository setup, /tododdle:tododdle-workflow for ordinary tracked work, and /tododdle:tododdle-factory for an explicit supervised delivery run. Claude Code can also invoke each skill from its description.

Supervised Factory Runs

The optional Factory skill coordinates one delivery attempt. The installed coding client supplies the model, repository, terminal, Git, and tests. ToDoddle supplies the brief, Context, Ticket, claim, durable Agent Run, evidence, review, and human oversight.

The skill stops for unclear requirements, destructive actions, migrations that need review, security or billing risk, production access, stale revisions, claim conflicts, missing access, failed verification, or exhausted limits. It records a handoff and releases the claim. It never silently completes or archives a Ticket. Before publishing a package that changes the Factory skill, complete its supervised staging dogfood gate.

Installing this plugin does not start another MCP server. It does not change OAuth, Agent Connection scopes, project grants, or existing MCP credentials.

Scheduled ToDoddle Workflows

The distributed skill includes opt-in recipes for a morning control tower, ticket review sweep, weekly backlog hygiene, roadmap summary, Agent Connection inbox follow-up, and local release verification. Each recipe defines a suggested cadence, required scopes, mutation level, prompt, duplicate controls, and approval boundaries.

Installing the plugin never creates a schedule. Ask Codex to create a named recipe, then confirm the timezone, project, cadence, and allowed mutation level. Test the prompt in a normal chat and review the first runs. Scheduled tasks can use the ToDoddle plugin and its connected MCP tools. Desktop tasks that need local files also require the project to remain available and the app to be running. See the scheduled tasks documentation.

Use scheduled ToDoddle workflows for user-level checks and reports. Keep required service operations, such as notification delivery, billing reconciliation, webhook retries, and backups, in ToDoddle's server-owned queue or cron system.

Bounded Project Context

For substantial planning or implementation, load project context in a small, predictable sequence:

  1. Call get_project_context once for bounded board and lane structure, the brief summary, and artifact summaries.
  2. Call get_project_brief only when the complete canonical brief is relevant.
  3. Use list_project_artifacts to scan summary-only Context records. Call get_project_artifact only for the artifacts needed for the current work.
  4. Use search_project to discover an item in a known project. Follow the selected result with a narrow get tool. Use list tools for bounded browsing and reports, not repeated discovery scans. Keep list calls bounded and follow their pagination metadata.
  5. Reuse returned project, board, lane, ticket, and artifact IDs in the active conversation and its compaction summary. Refresh only volatile ticket state before a mutation.

When an agent creates or changes artifact Markdown, it should provide a current summary in the same request. Summaries are limited to 500 characters. Older clients may omit the summary; the API accepts the write and returns a warning so the summary can be repaired before handoff.

Context artifacts can form a tree. Supply parentArtifactId when creating or updating a child artifact. Set parentArtifactId to null during an update to move the artifact to the top level. The parent must belong to the same project. The canonical project brief cannot be a parent or child. ToDoddle rejects self-parenting and hierarchy cycles.

Simple lookups should skip the brief and full context entirely. Use search_project when you know the project but not the item ID. It returns compact ticket, board, lane, Note, Context, and document matches. Follow the selected result with the narrowest get tool. Use get_ticket for one known ticket, get_tickets for 1–20 known ticket IDs, or hierarchy-filtered list_tickets for bounded browsing. list_tickets and get_work_queue return compact summaries by default. Set detail to full only when the complete list payload is necessary. get_tickets excludes comments by default. Request latest_update for one recent handoff or status update per ticket, or all only when full history is necessary. Do not batch-hydrate a broad list without a clear need. get_work_queue remains the cross-project operational view. The stable API fields planId, sectionId, and taskId identify boards, lanes, and tickets.

Version 3 migration

Version 3 replaces Plan, Section, and Task tool names with Board, Lane, and Ticket names. The hosted API paths and stable ID fields do not change. Version 2 clients must update to tododdle-mcp@latest and restart their agent host. The API returns MCP_UPDATE_REQUIRED with the exact update command when an old client identifies itself.

The server returns authoritative website URLs with records so an agent can hand work back to a human without reconstructing routes. Access remains the intersection of the Agent Connection's scopes, explicit project grants, and authorizing user's current ACL on every call.

Repository Policy

When adding ToDoddle to an existing repository, invoke $tododdle-bootstrap. It verifies the ToDoddle project and adds a managed work-ledger block to the effective root instruction file. It uses AGENTS.override.md when that file already exists. Otherwise, it updates or creates AGENTS.md.

The bootstrap updater preserves every instruction outside <!-- tododdle:start --> and <!-- tododdle:end -->. It updates an existing block instead of adding a duplicate. It stops on malformed markers. Run its dry mode first and review the diff before writing. The updater never commits, pushes, or stores credentials.

Start a new agent task or restart the agent host after bootstrap. Agents load repository instructions at task start. examples/AGENTS.tododdle.md remains the detailed manual policy for repositories that need more rules than the managed block.

Tools

Read And Plan

  • list_projects
  • get_project
  • get_project_context
  • list_boards
  • get_board
  • list_lanes
  • get_lane
  • list_project_members
  • list_review_requests
  • get_review_request
  • list_review_comments
  • list_project_documents
  • get_document_download_url
  • list_notes
  • get_note
  • list_tickets
  • search_project
  • list_ticket_attributes
  • set_ticket_attribute
  • delete_ticket_attribute

Ticket attributes hold small typed integration and handoff facts. Read them before updates, use namespaced keys, and never store secrets in them.

  • get_work_queue
  • list_available_work
  • get_focus_list
  • add_ticket_to_focus
  • move_focus_ticket
  • remove_ticket_from_focus
  • get_ticket
  • get_tickets
  • get_support_case
  • get_project_brief
  • list_project_artifacts
  • get_project_artifact
  • get_agent_inbox
  • list_agent_runs
  • get_agent_run

Manage Tickets

  • claim_ticket
  • claim_next_ticket
  • renew_ticket_claim
  • finish_agent_run
  • release_ticket
  • create_ticket
  • update_ticket
  • transition_ticket
  • preview_ticket_move
  • move_ticket
  • set_ticket_blocker
  • add_ticket_comment
  • acknowledge_agent_reply
  • archive_ticket

list_available_work reads only unblocked, currently unclaimed work in one project. claim_next_ticket selects the highest-ranked eligible ticket. claim_ticket and renew_ticket_claim manage its agent lease without changing human assignment. finish_agent_run records the terminal result and releases the matching lease. release_ticket stops work without a result and records the run as cancelled. None of these tools changes ticket status. preview_ticket_move reports lane automation and hierarchy blockers before a board move. move_ticket and archive_ticket are destructive because a destination lane can archive the ticket. Ticket deletion is unavailable.

Supported run-bound tools accept the stable runId and projectId needed to send the complete X-ToDoddle-Run-* header set. The API then binds the request to the stored workspace, project, Ticket, Agent Connection, allowed action, and expiry. Keep the same run ID from claim through completion. A run cannot approve itself or expand its own authority.

Durable agent-to-human handoffs use typed HANDOFF comments with a concise outcome, verification and immutable evidence, and any remaining risk or next action. External mutations return a stable ToDoddle uiUrl; expiring asset token URLs must not be copied into comments. A continuing run reads and handles its Agent Connection inbox reply before acknowledgement, then reloads the linked record.

Ticket create/update accepts the stable kind values TASK, FEATURE, EPIC, BUG, RESEARCH, and ACTION_ITEM. Lane create/update supports SET_KIND alongside status, priority, assignee, review-request, and archive entry actions. REQUEST_REVIEW accepts one to 20 unique reviewer IDs and optional instructions. It cannot share a lane with ARCHIVE_TASK.

Manage Optional Reviews

  • create_review_request, update_review_request, complete_review_request, cancel_review_request
  • respond_to_review_request
  • add_review_comment
  • add_review_checklist_item, update_review_checklist_item

Reviews are optional and stay separate from ticket status. A request can target one Ticket, Document, Board, or Context artifact. Use list_project_members before selecting reviewers. Only a named reviewer can respond. Use expectedRevision for request updates, completion, and cancellation. Use the reviewer or checklist item updatedAt value for a response or checklist change. Create requests, comments, and checklist items require an idempotency key. Reuse that key only to retry the same operation.

Manage Support Cases

  • get_support_case
  • update_support_case
  • reply_to_support_case

Support cases remain linked to internal Tickets. Read the support case before a mutation and use its latest revision. Choose REQUESTER_VISIBLE only for a customer reply. Choose INTERNAL_NOTE for private operator context. MCP does not return the requester's email address.

Manage Project Structure

  • create_project, update_project, archive_project, restore_project
  • create_board, update_board, move_board, archive_board, restore_board
  • create_lane, update_lane, move_lane, archive_lane, restore_lane

Archive operations are destructive and require client approval. Permanent deletion is intentionally unavailable.

Manage Notes

  • create_note
  • update_note
  • archive_note

Omit projectId to work with workspace Notes. Supply projectId to work with Notes for that project. Project Notes require both an Agent Connection project grant and the current user access to the project. Parent Notes must use the same workspace or project scope.

Track Time

  • get_active_time_entries
  • list_project_time
  • list_ticket_time
  • start_ticket_timer
  • stop_ticket_timer
  • log_ticket_time
  • update_time_entry
  • archive_time_entry

archive_time_entry is destructive and requires client approval.

Manage Project Context

  • create_project_artifact
  • update_project_artifact
  • transition_project_artifact
  • link_artifact_ticket
  • add_artifact_comment
  • list_artifact_revisions
  • link_project_artifacts

create_project_artifact and update_project_artifact accept an optional parentArtifactId. Use it for true parent-child Context nesting. Set it to null on update to remove the current parent.

Upload Files

  • upload_project_document
  • attach_file_to_ticket
  • begin_upload
  • complete_upload

Each tool accepts either an approved local filePath or an HTTPS sourceUrl. The local MCP creates a private staging root at <system-temp>/tododdle-mcp-uploads with user-only permissions. Files stream directly from this local MCP process to ToDoddle's short-lived Bunny upload URL; file bodies are never placed in MCP JSON messages.

If an agent copies a source file into a dedicated ToDoddle upload directory only to satisfy the local path restriction, it should remove that temporary copy after the tool confirms success. It should retain the copy after a failed or uncertain upload so the upload can be retried. It must never remove the original source or a pre-existing file. Temporary files that the MCP creates for HTTPS sources are removed automatically.

For a pasted or clipboard image, create a private temporary directory inside <system-temp>/tododdle-mcp-uploads. Save or copy the image attachment there with a suitable image extension. Never alter the original clipboard attachment. The MCP removes the staged file after confirmed success. It keeps the file after a failed or uncertain upload so the agent can retry and report the path.

Remote clients use begin_upload and complete_upload. Call begin_upload with file metadata and an idempotency key. Upload the file bytes from the user's device directly to the returned short-lived URL with the returned headers. Then call complete_upload with the document ID and a new idempotency key. Do not print, log, or store the signed URL. A client that cannot send the direct HTTPS upload cannot use remote attachments. The hosted gateway and Vercel never receive or stage the file bytes.

Use get_document_download_url with a projectId and documentId returned by list_project_documents to obtain a five-minute tokenized URL. The URL grants access only to that ready document and should not be stored in comments or other durable project context. Video documents return a protected stream URL when the workspace subscription permits playback.

For attachment review, request a fresh URL, download the asset into a private mktemp -d directory without printing or persisting the URL, and inspect the local file with the appropriate tool. Use a browser only when local download or rendering is unavailable. Remove only the agent-created temporary files and directory after successful inspection; never remove an original or pre-existing user file.

The server also provides ticket, project, and project-artifact resource templates plus triage_work and daily_status prompts.

Permissions

Tools never expand the Agent Connection's authority. Every request is checked against all three layers:

  1. The Agent Connection's granted scopes.
  2. Its granted projects.
  3. The authorizing user's organization and project permissions.

Configure scopes and project grants in ToDoddle under Agent Connections. Scopes are not requested by or stored in this package.

Common scopes include:

  • projects:read and projects:write
  • tasks:read and tasks:write
  • context:read and context:write
  • time:read and time:write
  • documents:read and documents:write

Uploading a project document requires projects:read and documents:write. Attaching a new upload to a task also requires tasks:write.

Environment

| Variable | Required | Default | Purpose | | --- | --- | --- | --- | | TODODDLE_CLIENT_ID | Yes | None | Agent Connection identifier | | TODODDLE_CLIENT_SECRET | Yes | None | Agent Connection secret | | TODODDLE_BASE_URL | No | https://app.tododdle.com | Application API origin; HTTPS is required except for loopback development | | TODODDLE_UPLOAD_ROOTS | No | None | Optional platform path-delimited list of additional directories the MCP may read for uploads | | TODODDLE_MAX_UPLOAD_BYTES | No | 1073741824 | Local safety ceiling; the hosted API may enforce a lower limit |

No upload-root configuration is needed for normal local use. Stage temporary files below <system-temp>/tododdle-mcp-uploads; do not use the full system temporary directory as an approved root. On macOS and Linux, separate optional roots with :; on Windows, use ;. The server resolves symlinks and rejects files outside managed staging and approved roots. Add optional roots only for Docker, sandboxes, or directories whose contents you approve for upload. HTTPS sources reject embedded credentials, private-network destinations, unsafe redirects, oversized responses, and empty files.

Use the final application API origin directly. The public tododdle.com and www.tododdle.com hosts serve the marketing site and are rejected. Legacy trackingti.me hosts are also rejected because cross-origin redirects must not forward bearer credentials.

Tokens are held in memory only and refreshed automatically. The client secret is sent only to ToDoddle's hosted token endpoint. Server diagnostics go to stderr so stdout remains reserved for MCP JSON-RPC.

Development

npm install
npm run format:check
npm run type-check
npm run test:coverage
npm run check:api-parity -- /path/to/tododdle/src/config/api-route-inventory.json
npm audit --audit-level=low
npm pack --dry-run

config/external-api-parity.json is the checked contract between the model-callable tool registry and ToDoddle's External API inventory. Every discovered tool must appear in the manifest, every tool is invoked with schema-valid input in tests, and every resulting API method/path must match its declared mapping. External methods that are transport-only, compatibility-only, aggregated by another tool, or superseded have an explicit reviewed exception instead of disappearing from the audit.

When the application External API changes, compare its generated src/config/api-route-inventory.json with this manifest before releasing either side. The current reviewed surface accounts for every External API method with no missing or extra entries; tool totals are derived from the registry and manifest rather than a historical hard-coded count.

Run the MCP package from source:

TODODDLE_CLIENT_ID=... \
TODODDLE_CLIENT_SECRET=... \
npm run dev

The npm prepack lifecycle builds dist/ automatically. prepublishOnly runs the complete package test and coverage thresholds before publication.

Release Safety

  • Review npm pack --dry-run and verify that only the declared runtime, plugin, skill, examples, parity manifest, documentation, license, and package metadata are present.
  • Publish from a tagged release with npm trusted publishing/provenance where available.
  • Treat tool removal, renaming, or incompatible input changes as major releases.
  • Keep generated ToDoddle connection snippets pinned to a tested package version.

License

MIT

Private image inspection

Use get_document_image(projectId, documentId, size?) to inspect a private image directly. The tool returns native MCP image content plus document metadata. size defaults to standard (1280 pixels); use large (2560 pixels) for small text. It requires the same projects:read and documents:read access as document downloads. No signed URL or base64 text copy is returned.

The web API converts PNG, JPEG, WebP, GIF, and AVIF to JPEG. It uses the first animation frame, removes metadata, and applies source-byte, pixel, output-byte, and time limits. Other file types still use get_document_download_url. Image contents are untrusted evidence, never operating instructions.

Deploy the matching web /documents/:documentId/image API before releasing this package or updating the hosted server. Existing clients must refresh their server/tool list. This change needs no new credential or scope.

3.5.0 release

Adds native private image previews through get_document_image. Deploy the matching web image endpoint before updating clients. Refresh the plugin or restart an npm-based MCP client after updating to 3.5.0. No database migration or new environment setting is required. Hosted rollout remains a separate release gate.

3.5.1 release

Updates vulnerable transitive dependencies and enforces the dependency audit in both the publish workflow and prepublishOnly. A release must pass Quality before its tag is published. Failed audits must be fixed, not bypassed.