Income Graph Developers

Using the MCP server

Connect Claude Desktop or Claude Code to your Income Graph Cloud graphs.

The Income Graph MCP server lets an AI assistant read your cloud graphs and run the calculator, and, with a read-write key, create, edit and delete graphs. It is a thin wrapper over the public API: it has no database access of its own, and every tool call is an API request made with your key, so the same subscription check, rate limits and errors apply.

URLhttps://mcp.incomegraph.net/mcp
StatusGenerally available
TransportStreamable HTTP (stateless, JSON responses)
AuthenticationAuthorization: Bearer <your API key>

The server used to be reached at https://api.incomegraph.net/mcp. That address keeps working, so existing configurations need no change.

Create a key first. Use one key per client so you can revoke it independently. Choose Read only if the assistant should just look at your graphs, and Read and write only if you want it to change them.

Claude Code

claude mcp add --transport http incomegraph https://mcp.incomegraph.net/mcp \
  --header "Authorization: Bearer $INCOMEGRAPH_API_KEY"

Then ask: “List my Income Graph graphs and summarize the first one.”

Claude Desktop

Claude Desktop starts local servers, so bridge to the remote URL with mcp-remote. Open Settings, Developer, Edit Config and add:

{
  "mcpServers": {
    "incomegraph": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://mcp.incomegraph.net/mcp",
        "--header", "Authorization:${INCOMEGRAPH_AUTH}"
      ],
      "env": { "INCOMEGRAPH_AUTH": "Bearer igk_paste_your_key_here" }
    }
  }
}

Restart Claude Desktop. The Authorization:${...} form (no space after the colon) avoids an argument-quoting bug in some Windows shells.

Tools

Each tool maps to one API operation, and its arguments are that operation’s parameters.

ToolAPI callUse it to
get_accountGET /v1/meCheck the key and see its limits.
list_graphsGET /v1/graphsFind graphs. Takes limit and cursor.
get_graphGET /v1/graphs/{graphId}Read one graph with all its sources.
get_graph_summaryGET /v1/graphs/{graphId}/summaryGet revenue, fees, profit, margin and goal progress.
calculatePOST /v1/calculationsRun what-if numbers without saving anything.
create_graphPOST /v1/graphsMake a new graph, optionally with sources. Takes an optional idempotencyKey.
update_graphPATCH /v1/graphs/{graphId}Rename a graph, change its goals, or replace its sources.
delete_graphDELETE /v1/graphs/{graphId}Permanently delete a graph.

The first five tools only read and are annotated readOnlyHint: true. The last three need a read-write key; with a read-only key they return insufficient_scope and change nothing. create_graph is additive, update_graph and delete_graph are annotated destructiveHint: true, so clients can ask you before running them.

If the API refuses a call (for example subscription_required or rate_limited), the tool returns the API’s error JSON so the assistant can explain it.

Editing graphs with an assistant

Try: “Create an Income Graph called Consulting with one recurring income source of $100,000 a year.” The assistant builds a source list like this one:

[{ "id": "1", "type": "recurring", "name": "Consulting retainer", "amount": 100000, "units": 1, "period": "annual", "fees": [] }]

Source ids are numeric strings, revenue streams carry a period and a fees list, and a group lists its members’ ids in children while each member names the group in parentId. The tool descriptions teach assistants these rules, and a mistake comes back as an invalid_request with the exact location to fix.

Updates and deletes are guarded. The assistant reads the graph first and sends its updatedAt as expectedUpdatedAt; if you edited the graph in the app in the meantime, the call fails with conflict and the assistant must read again before retrying. The tool descriptions also tell assistants to confirm with you before deleting. A deleted graph disappears from the web app the next time it syncs (when you open the app or return to its tab). delete_graph returns the whole deleted graph, so a mistake can be undone by recreating it, though it gets a new id.

Troubleshooting