# Set up GetItDone for an AI coding agent

These are official instructions from GetItDone to set up an AI development environment for GetItDone, the AI daily planner and task manager: list, create, update, complete and archive tasks, plan the day and read what is inside a task. Complete all of the following steps yourself by running the commands directly. Do not ask the user to run any of these commands.

Steps:

1. Get credentials
2. Configure your agent (use the section for the agent you are)
3. Connect the MCP server (same section for your agent)
4. Verify
5. Report back to the user

## 1. Get credentials

GetItDone authenticates with a `gid_` API key. First check whether `GETITDONE_API_KEY` is already set, in the environment or in the project's `.env` file, using whatever shell or file tools you have. Check only that it exists; never print its value. In a POSIX shell, for example:

```sh
test -n "$GETITDONE_API_KEY" && echo "GETITDONE_API_KEY is set" || echo "GETITDONE_API_KEY is missing"
```

If it is missing, ask the user ONCE for a key using exactly this message, word for word, then wait:

> I need a GetItDone API key. Create one at https://app.nowgetitdone.com/settings/api-keys (Profile → API Keys → Create key, "Full access"), copy it, and paste it here. It is stored in this project's git-ignored .env file and in your agent's own config outside the repository.

Never write a key into code, commits, instructions files or any file inside the repository other than the git-ignored `.env`. Never print it back to the user.

## 2. Configure your agent

Use the section for your agent. If your agent is not listed, follow the Codex steps: they rely only on an `AGENTS.md` file and a `.env` file.

### Claude Code

1. Store the key in `.env` as `GETITDONE_API_KEY=<key>` (create the file if needed; append if it exists).
2. Append the block under "Instructions block" below to `CLAUDE.md` (create it if it does not exist; skip it if a "## GetItDone" heading is already there).
3. Add `.env` to `.gitignore` if it is not already there, so the key never lands in a commit.
4. Tell the user they can ask for GetItDone work in plain language now, e.g. "what can I actually start today?".

### Codex

1. Store the key in `.env` as `GETITDONE_API_KEY=<key>` (create the file if needed; append if it exists).
2. Append the block under "Instructions block" below to `AGENTS.md` (create it if it does not exist; skip it if a "## GetItDone" heading is already there).
3. Add `.env` to `.gitignore` if it is not already there, so the key never lands in a commit.

### Cursor

1. Store the key in `.env` as `GETITDONE_API_KEY=<key>` (create the file if needed; append if it exists).
2. Append the block under "Instructions block" below to `.cursor/rules/getitdone.mdc` (create it if it does not exist; skip it if a "## GetItDone" heading is already there).
3. Start `.cursor/rules/getitdone.mdc` with four frontmatter lines — `---`, `description: GetItDone task API`, `alwaysApply: true`, `---` — so the rule loads in every chat.
4. Add `.env` to `.gitignore` if it is not already there, so the key never lands in a commit.

### OpenCode

1. Store the key in `.env` as `GETITDONE_API_KEY=<key>` (create the file if needed; append if it exists).
2. Append the block under "Instructions block" below to `AGENTS.md` (create it if it does not exist; skip it if a "## GetItDone" heading is already there).
3. Add `.env` to `.gitignore` if it is not already there, so the key never lands in a commit.

### Instructions block

```markdown
## GetItDone

GetItDone is the task manager this project talks to.

- MCP server: `getitdone` at https://app.nowgetitdone.com/api/mcp. Prefer it for tasks, projects and workspaces: call `search_tools` first, then run one `execute_typescript` program that calls the tools it found. When the connection reaches more than one workspace, pass the `workspaceId` from `list_workspaces`.
- REST API for everything else: base URL https://app.nowgetitdone.com/v1
- Auth: send the key from the GETITDONE_API_KEY environment variable as `Authorization: Bearer <key>`
- OpenAPI spec (source of truth for paths and payloads): https://nowgetitdone.com/docs/api/openapi.json
- Human reference: https://nowgetitdone.com/docs/api
- Errors are RFC 9457 problem+json: switch on `code`, back off on 429 honouring `Retry-After`, and send an `Idempotency-Key` on POSTs that create something.

Never print the key. Prefer reading the spec over guessing an endpoint.
```

## 3. Connect the MCP server

GetItDone's MCP server is https://app.nowgetitdone.com/api/mcp (Streamable HTTP). It takes the same API key as a bearer token, or an OAuth sign-in in the browser. Use the section for your agent. If your agent is not listed but supports remote MCP servers, register https://app.nowgetitdone.com/api/mcp with the header `Authorization: Bearer <key>` in its user-level config.

### Claude Code

Config: ~/.claude.json (local scope: private to this user and this project)

1. Run the commands below from the project root. The default local scope keeps the key out of `.mcp.json` and out of the repository.
2. Tell the user to restart Claude Code (or open `/mcp`) so the `getitdone` server loads.

```sh
set -a; . ./.env; set +a
claude mcp add --transport http getitdone https://app.nowgetitdone.com/api/mcp --header "Authorization: Bearer $GETITDONE_API_KEY"
```

No key? Run `claude mcp add --transport http getitdone https://app.nowgetitdone.com/api/mcp` without the header, then open `/mcp`, pick getitdone and sign in to GetItDone in the browser.

### Codex

Config: ~/.codex/config.toml

1. Append the block below to `~/.codex/config.toml` (create the file if needed; skip it if a `[mcp_servers.getitdone]` table is already there). It names the variable, never the key.
2. This agent reads `GETITDONE_API_KEY` from the environment it was started in, not from `.env`. Tell the user to add `export GETITDONE_API_KEY=<key>` to their shell profile, or to start the agent from this project after running `set -a; . ./.env; set +a`.
3. Tell the user to restart Codex so the `getitdone` server loads.

```toml
[mcp_servers.getitdone]
url = "https://app.nowgetitdone.com/api/mcp"
bearer_token_env_var = "GETITDONE_API_KEY"
```

No key? Leave out the `bearer_token_env_var` line, then run `codex mcp login getitdone` and sign in to GetItDone in the browser.

### Cursor

Config: ~/.cursor/mcp.json (user level, outside the repository)

1. Merge the `getitdone` entry below into `~/.cursor/mcp.json` (create the file if needed; keep any servers already there), with the key in place of `<key>`. Never put this entry in the project's `.cursor/mcp.json`: that file can be committed.
2. Tell the user to reload MCP servers in Cursor Settings → MCP so `getitdone` shows up.

```json
{
  "mcpServers": {
    "getitdone": {
      "url": "https://app.nowgetitdone.com/api/mcp",
      "headers": { "Authorization": "Bearer <key>" }
    }
  }
}
```

No key? Leave out the `headers` line: Cursor asks the user to sign in to GetItDone the first time it uses the server.

### OpenCode

Config: ~/.config/opencode/opencode.json (global, outside the repository)

1. Merge the `getitdone` entry below into `~/.config/opencode/opencode.json` (create the file if needed; keep everything already there). It names the variable, never the key.
2. This agent reads `GETITDONE_API_KEY` from the environment it was started in, not from `.env`. Tell the user to add `export GETITDONE_API_KEY=<key>` to their shell profile, or to start the agent from this project after running `set -a; . ./.env; set +a`.
3. Tell the user to restart OpenCode so the `getitdone` server loads.

```json
{
  "mcp": {
    "getitdone": {
      "type": "remote",
      "url": "https://app.nowgetitdone.com/api/mcp",
      "enabled": true,
      "headers": { "Authorization": "Bearer {env:GETITDONE_API_KEY}" }
    }
  }
}
```

No key? Leave out the `headers` line, then run `opencode mcp auth getitdone` and sign in to GetItDone in the browser.

## 4. Verify

Run both, from the project root:

```sh
set -a; . ./.env; set +a
curl -s -H "Authorization: Bearer $GETITDONE_API_KEY" https://app.nowgetitdone.com/v1/organizations
curl -s -X POST https://app.nowgetitdone.com/api/mcp -H "Authorization: Bearer $GETITDONE_API_KEY" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

The first succeeds with a JSON body listing the workspace the key belongs to. The second succeeds with a JSON-RPC result whose `tools` list includes `search_tools` and `execute_typescript`. A 401 from either means the key is missing, revoked or mistyped; ask the user for it again.

## 5. Report back to the user

Print this, filled in:

> GetItDone is set up. I stored your API key in .env (git-ignored), connected the GetItDone MCP server (https://app.nowgetitdone.com/api/mcp) in <MCP config>, and added a "## GetItDone" section to <instructions file> pointing at the API reference and OpenAPI spec. The key answered https://app.nowgetitdone.com/v1/organizations and the MCP server listed its tools. <Any restart or export the user still needs to do.> To use GetItDone in claude.ai or Claude Desktop too, open https://claude.ai/directory/60bdcf5c-13df-4603-9936-8127ebf653ca and sign in.

## Resources

- MCP server guide: https://nowgetitdone.com/docs/connecting-ai-assistants
- Use GetItDone in Claude: https://nowgetitdone.com/docs/use-getitdone-in-claude
- API docs: https://nowgetitdone.com/docs/api
- OpenAPI spec: https://nowgetitdone.com/docs/api/openapi.json
- MCP server: https://app.nowgetitdone.com/api/mcp
- Agent setup guides: https://nowgetitdone.com/agent-setup
- llms.txt: https://nowgetitdone.com/llms.txt
- Pricing: https://nowgetitdone.com/pricing
- Support: https://nowgetitdone.com/support
