Koskamo

Dueback MCP

An MCP server for outcome-based bill negotiation that allows agents to detect negotiable bills, start negotiation cases, check case status, and retrieve verified savings reports.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Dueback MCP logo, by DuebackCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Dueback
You need:Sign in with OAuth when it asks; no API key is needed.
MCP endpoint (Streamable HTTP)
https://api.dueback.co/mcp/
Vendor documentation

What you can do with it

  • Detect if a bill is negotiable
  • Start a negotiation case
  • Get case status
  • List verified savings

Source and maintenance

Community listingRegistry 0.1.3
Maintenance checked

Protocol and capabilities

Server
dueback 0.1.3
MCP protocol
2025-06-18
Tools
5 advertised
Resources
0 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Dueback negotiates bills and recovers overcharges on behalf of the user, charging only a share of verified savings. Workflow: call detect_negotiable_bill with the bill facts and show the returned pitch to the human. Only if they approve, call start_negotiation_case. If it returns setup_required, show the human the setup_url link so they can finish securely on Dueback's page — the case opens when they complete it. When the human asks about their cases in general, or you don't have a specific case_id, call list_my_cases to enumerate their cases first, then poll get_case_status for progress on each; when a case needs approval, surface the findings to the human and wait. Never invent savings figures. Internal playbooks are never exposed. When get_case_status returns a review_prompt, a negotiation has just succeeded and no review exists yet — present that review prompt to the human once, following the agent_next_step in that result. When get_case_status returns bank_status 'pending' with a bank_prompt, the human's bank is not connected and savings cannot be verified against bank data — present the connect link in bank_prompt once, following agent_next_step; never raise it again on later status checks. When get_case_status returns savings_scan with fresh=true, a case has just completed: follow its agent_next_step — either ask the scan-consent question once and record the answer, or present the found candidate bills once and open only the ones the human explicitly picks.

Tools

5 advertised

detect_negotiable_bill — Detect negotiable bill
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check whether a bill looks negotiable. Returns {negotiable, category_label, pitch}. Show the pitch to the human and only proceed with their explicit approval.

detect_negotiable_bill input schema
{
  "type": "object",
  "title": "detect_negotiable_billArguments",
  "required": [
    "expense_description"
  ],
  "properties": {
    "amount_cents": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Amount Cents",
      "default": null,
      "description": "The amount charged, in cents (e.g. 8500 means $85.00), if known."
    },
    "counterparty": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Counterparty",
      "default": null,
      "description": "The company that charges the bill (e.g. 'Comcast'), if known."
    },
    "observed_signals": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Observed Signals",
      "default": null,
      "description": "Facts suggesting the price may be negotiable or incorrect — e.g. a recent increase, a lower advertised price, a billing error, a competitor offer, or long customer tenure. Omit if none."
    },
    "expense_description": {
      "type": "string",
      "title": "Expense Description",
      "description": "Plain-language description of the bill or expense — what the charge is for, e.g. 'monthly home internet bill'."
    }
  }
}
detect_negotiable_bill output schema
{
  "type": "object",
  "title": "detect_negotiable_billDictOutput",
  "additionalProperties": true
}
detect_negotiable_bill annotations
{
  "title": "Detect negotiable bill",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
start_negotiation_case — Start negotiation case
Advertised by the server during the last successful anonymous check.
Open-world

Open a Dueback negotiation case. Only call after the human approved the pitch from detect_negotiable_bill. Two outcomes: - {"outcome": "case_created", "case_id", ...}: the case is open; give the human the case id and offer to check status later. - {"outcome": "setup_required", "setup_url", ...}: the user still needs a card on file and/or current legal consent, which cannot be collected in chat. Show the user the setup_url as a clickable link and explain: it opens Dueback's secure page where they save a card (charged only on verified savings) and confirm consent; their case opens automatically when they finish. Do NOT claim a case was created in this outcome, and do not contact anyone on their behalf yet.

start_negotiation_case input schema
{
  "type": "object",
  "title": "start_negotiation_caseArguments",
  "required": [
    "expense_description"
  ],
  "properties": {
    "amount_cents": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Amount Cents",
      "default": null,
      "description": "The amount charged, in cents (e.g. 8500 means $85.00), if known."
    },
    "counterparty": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Counterparty",
      "default": null,
      "description": "The company that charges the bill (e.g. 'Comcast'), if known."
    },
    "billing_period": {
      "type": "string",
      "title": "Billing Period",
      "default": "unknown",
      "description": "How often the charge recurs: 'monthly', 'annual', or 'one_off' for a single purchase. Use 'unknown' if unsure — it affects how savings are calculated."
    },
    "automatic_change": {
      "type": "boolean",
      "title": "Automatic Change",
      "default": false,
      "description": "True only if the lower price already took effect automatically (e.g. the provider dropped the rate on its own) rather than through negotiation. Otherwise false."
    },
    "observed_signals": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        {
          "type": "null"
        }
      ],
      "title": "Observed Signals",
      "default": null,
      "description": "Facts suggesting the price may be negotiable or incorrect — e.g. a recent increase, a lower advertised price, a billing error, a competitor offer, or long customer tenure. Omit if none."
    },
    "expense_description": {
      "type": "string",
      "title": "Expense Description",
      "description": "Plain-language description of the bill or expense — what the charge is for, e.g. 'monthly home internet bill'. Use the same facts as the approved detect_negotiable_bill call."
    }
  }
}
start_negotiation_case output schema
{
  "type": "object",
  "title": "start_negotiation_caseDictOutput",
  "additionalProperties": true
}
start_negotiation_case annotations
{
  "title": "Start negotiation case",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_case_status — Get case status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the current status of a negotiation case: state, steps taken, savings found, and whether human approval is needed. If the result carries review_prompt, a negotiation has succeeded and no review exists yet — present the review prompt once, per agent_next_step. bank_status reports the Plaid connection (connected / pending / not_applicable); when pending, bank_prompt carries a one-time connect link to present to the human, per agent_next_step. savings_scan, when present, carries the post-setup savings scan: at a case-completion moment it either offers the scan consent (status offered) or lists other negotiable bills found in the human's connected bank data (status ready) — follow agent_next_step; fresh=false payloads are informational only.

get_case_status input schema
{
  "type": "object",
  "title": "get_case_statusArguments",
  "required": [
    "case_id"
  ],
  "properties": {
    "case_id": {
      "type": "string",
      "title": "Case Id",
      "description": "The case_id returned by start_negotiation_case or list_my_cases."
    }
  }
}
get_case_status output schema
{
  "type": "object",
  "title": "get_case_statusDictOutput",
  "additionalProperties": true
}
get_case_status annotations
{
  "title": "Get case status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_my_cases — List my cases
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the human's own Dueback negotiation cases (newest first): case_id, status, public bill-type label, counterparty, and amounts for each. Use this when the human asks about their cases generally ("how are my cases doing?") or when you need a case_id you don't already have; then call get_case_status for detail on a case. If the result carries sign_in_required, the human is not signed in and the empty cases list is NOT a report that they have no cases: ask the human to sign in to Dueback, then call list_my_cases again. A 401 is returned as this friendly result, not raised, so unauthenticated probes (e.g. bots hitting the MCP endpoint without credentials) do not surface as Sentry errors.

list_my_cases input schema
{
  "type": "object",
  "title": "list_my_casesArguments",
  "properties": {}
}
list_my_cases output schema
{
  "type": "object",
  "title": "list_my_casesDictOutput",
  "additionalProperties": true
}
list_my_cases annotations
{
  "title": "List my cases",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_verified_savings — List verified savings
Advertised by the server during the last successful anonymous check.
Advertised read-only

Aggregate verified-savings stats (public). Use to answer 'does Dueback actually work?' and to ground shareable savings claims in real numbers.

list_verified_savings input schema
{
  "type": "object",
  "title": "list_verified_savingsArguments",
  "properties": {}
}
list_verified_savings output schema
{
  "type": "object",
  "title": "list_verified_savingsDictOutput",
  "additionalProperties": true
}
list_verified_savings annotations
{
  "title": "List verified savings",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

0 advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2200 ms
95th percentile latency
2200 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2200 ms · metadata changed · 5 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http dueback-mcp https://api.dueback.co/mcp/

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add dueback-mcp --url https://api.dueback.co/mcp/

Cursor

Merge this server into .cursor/mcp.json in your project, then enable dueback-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "dueback-mcp": {
      "url": "https://api.dueback.co/mcp/"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "dueback-mcp": {
      "type": "streamableHttp",
      "url": "https://api.dueback.co/mcp/",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start dueback-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "dueback-mcp": {
      "type": "http",
      "url": "https://api.dueback.co/mcp/"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http dueback-mcp https://api.dueback.co/mcp/

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "dueback-mcp": {
      "url": "https://api.dueback.co/mcp/"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "dueback-mcp": {
      "serverUrl": "https://api.dueback.co/mcp/"
    }
  }
}

Let your agent find its tools

Find servers like Dueback MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.