Koskamo

ChatStack App Cost Estimator MCP

An MCP server that enables AI agents to estimate development costs, scope MVPs, and generate Product Requirements Documents (PRDs) with user stories and technical specifications through an interview-driven workflow.

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.

ChatStack App Cost Estimator MCP logo, by ChatStackVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by ChatStack
MCP endpoint (Streamable HTTP)
https://mcp.chatstack.app/mcp
Vendor documentation

What you can do with it

  • Estimate development costs and hours for an app idea
  • Scope an MVP and generate user stories
  • Create functional and non-functional requirements
  • Produce a technical specification for AI coding tools

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
chatstack-app-cost-estimator 0.9.4
MCP protocol
2025-06-18
Tools
5 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "resources": {
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/skills": {}
  }
}

Server-provided instructions

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

## When to use ChatStack Use ChatStack when the user wants an app or software development cost estimate, an MVP estimate, development hours, a software quote, to scope an app idea, or to generate a software PRD (Product Requirements Document). Use it for requests such as “How much would my app cost?”, “How much does it cost to build an app like…”, “Scope an MVP”, or “Generate a software PRD for my app idea”, even when the user does not name ChatStack. Do not invoke it for definition-only questions such as “What is a PRD?”, code editing, calendar lookup, or general advice. Do not use this server to retrieve or manage existing ChatStack portal projects. Five tools only: `start_session`, `send_turn`, `send_action`, `get_estimate_status`, `submit_prd`. ## Session identifiers Every result prints `thread_id` and `interview_handle` under Session. Read them from there. Never re-run `start_session` to recover them, and never call the HTTP endpoint directly. Pass both to every later tool. Continue an existing session using its returned `thread_id` and `interview_handle`. If those identifiers are unavailable, explain that the session cannot be resumed from the available context rather than inventing them. ## Interaction mode ### Choose an interaction mode Omit `interaction_mode` unless the user explicitly selected Review each step (`clarify_first`) or Run it for me / auto-complete (`auto_complete`). An estimate, quote, price, or fast answer request alone does not select `auto_complete`. Preserve a mode the user already explicitly chose; do not ask them to choose it again. Omitted `interaction_mode` leaves mode unset and returns `interaction_mode_question`: you MUST show both Review each step and Run it for me, with Review each step as the default, and wait for the user's pick — every MCP-connected assistant must honor this. Pass their choice as `send_turn.interaction_mode` (`clarify_first` or `auto_complete`). Never use `send_action` or `mode_select_a` / `mode_select_b` / `mode_select_c` for Review each step or Run it for me. Those actions are the later How-much-time pick (Normal / Quick estimate / Detailed). If no mode is set yet and the user continues without choosing, omit `interaction_mode` and the server accepts `clarify_first`. When the user did name a mode you get a confirmation notice instead — relay it and continue. `send_turn` can switch the existing thread with `interaction_mode`. ### Distinct interactions per mode #### Review each step In `clarify_first`, present the returned choices and wait for approval or changes. Ask for approval only in `clarify_first`. For clarifying questions, show every question and every option letter WITH its full option text. Never collapse to 'Product type: A / B / C'. After the full options, you may suggest one combination in text, such as 1A, 2B. Do not send that combination until the user agrees. When `pending_gate` is `mode_selection` in `clarify_first`: show the tool text heading **How much time do you have?** and options Normal / Quick estimate / Detailed **verbatim**. Never invent vague A/B/C labels — paste the titles and descriptions from the tool text. Wait for the user to pick A, B, or C, then `send_action` `mode_select_a` / `mode_select_b` / `mode_select_c`. Show the summary or generated artifact table and wait for the user's choice before `send_action`. The Your choices list shows each button as its label and its `action_type`. Pass that id, not the visible label (for example `interview_summary_accept` or `story_actions_looks_good`). `confirmed_by_user=true` is preferred but not required when `action_type` is set. Never call `send_action` with an empty `action_type` in `clarify_first`. While clarifying questions are waiting, `next_tool` is `send_turn`. A typed reply, including "1A, 2B", goes through `send_turn` as their exact text. Call `send_action` with `clarifying_questions_submit` and `payload.answers` keyed by question id (`q1` → `"A"`) only when they use Submit my answers. Do not split one question into several letters. Another clarifying round after submit is normal. #### Run it for me In `auto_complete` (Run it for me): do **not** ask the user to answer clarifying questions, approve a summary, pick How-much-time, or approve artifact tables. Each `send_turn` / `send_action` auto-answers **one** milestone. For clarifying questions it chooses the option that best fits a sensible standard for the app the user described, and the decision receipt states that assumption. It uses Normal time and approves artifact tables. Relay the receipt and table verbatim, then call `send_action` once per result with an empty payload to continue. Do not re-ask the user. Do not call `send_action` again for the same result. Repeat on the next result until `next_tool` is `submit_prd` — then offer submission and request or confirm contact details only if the user wants to submit. ## Tool routing and workflow ### Start or resume a session To begin a new estimate session, call `start_session`. For a progress-only request or uncertain session state, call `get_estimate_status` using the existing `thread_id` and `interview_handle`; do not advance the workflow or create a replacement session. After each turn, inspect `flow_stage`, `pending_gate`, `pending_gate_payload`, and `next_tool`. After `requirements_approve` the next artifact is the technical spec, not the estimate. ## Presenting results ### Display results and handle changes Relay Markdown **pipe-tables** for user stories, requirements, tech specs, and estimates **verbatim** — do not rewrite them as 'N user stories covering …' or any other bullet summary. After requirements / tech spec / estimate tables, relay **Assumptions** (and estimate **Risks** when present) as bullet lists from the tool text. Show the table first, followed by assumptions and risks. If the user answers a question or asks to change stories / requirements / tech specs, call `send_turn` with their exact words even when `next_tool` is `send_action` — do not rewrite the table yourself. `stories_reject`, `requirements_reject`, and `techspec_reject` show the current table again and wait. When the user describes the change, call `send_turn` with their exact words and show the regenerated table that comes back. Relay the updated pipe-table from the next tool result. Ask for approval only in `clarify_first`; in `auto_complete`, continue using the returned `next_tool` and gate state. Report costs, development hours, currency, scope, assumptions, exclusions, and risks only as returned by the tools. Describe the cost as an indicative development estimate, not a binding quote. Do not convert development hours into a delivery date or invent a timeline, sprint plan, or go-live date. ## Submission and recovery ### Submit the PRD When `next_tool` is `submit_prd`, explain that submission emails the pack and creates a ChatStack portal project (https://www.portal.chatstack.app). Offer this next step, collect or confirm first name, last name, email, country, and project name, and offer optional feedback. Submit via `submit_prd` only after confirmation. If the user wants only the estimate, declines submission, or asks to stop, honor that choice and do not create a portal project. Call `submit_prd` only after the estimate artifacts exist, `next_tool` requests `submit_prd`, submission has not already succeeded, and the user has confirmed the contact details and submission. Before `submit_prd`, tell the user it emails the pack and creates a portal project. Propose any `first_name`, `last_name`, `email`, `country`, or `project_name` they already stated (or a `project_name` the tool suggested). Show those for confirmation and ask only for the missing ones. If none are known, ask for all five. Retry with those fields and `confirmed_by_user=true`. Offer optional feedback and omit it if they skip. Never invent a contact field. If they decline, do not submit. Omit contact arguments when the thread already collected them. ### Submission success and recovery After `submit_prd`, success is only a ### PRD submitted receipt that includes `project_id` and `version_id`. A missing `next_tool`, a timeout, or an error is not success. If the result is unclear, call `get_estimate_status`. Never call `submit_prd` again after a receipt with both ids. A blind retry can create a duplicate project. After success, reply with `post_submit_notice` verbatim. Do not omit any URL, replace it with a summary, or add an email-delivery caveat. A recovery status intentionally confirms the submission without claiming inbox delivery.

Tools

5 advertised

start_session — Start an app cost estimate
Advertised by the server during the last successful anonymous check.

Start a guided session to estimate app development cost, scope an MVP, and generate a software PRD. No portal account or personal access token is required. Call it with no arguments unless the user already named Review each step (clarify_first) or Run it for me (auto_complete). Do not choose an interaction mode on the user's behalf — wanting an estimate or a fast answer is not auto_complete. If interaction_mode_question is returned, show both Review each step and Run it for me, with Review each step as the default, and wait for the user's pick before send_turn. The text result has a Session section with thread_id and interview_handle. Copy those into every later tool. Preserve an explicitly selected mode without asking the user to choose again.

start_session input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "interaction_mode": {
      "enum": [
        "auto_complete",
        "clarify_first"
      ],
      "type": "string",
      "description": "Omit this. Set it only when the user explicitly named a mode (e.g. \"use auto-complete\"): clarify_first reviews every gate, auto_complete advances on its own and reports each decision."
    }
  }
}
start_session output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "result": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "additionalProperties": {}
}
start_session annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
send_turn — Continue app estimate or revise scope
Advertised by the server during the last successful anonymous check.

Continue an app cost estimate by sending the user's answers or requested changes to the MVP scope, user stories, requirements, or technical specification. Pass their exact words in input_as_text, even when next_tool is send_action. Compact replies such as "1A, 2B" are valid. Preserve the user's selections; in interaction mode Review each step do not choose answers for them. In interaction mode Review each step, relay the pipe-table and wait for approval. In Run it for me, relay the table and the decision receipt, then continue. After the user picks Review each step or Run it for me, set interaction_mode to clarify_first or auto_complete on this call. Include input_as_text when their reply also contains an idea or an answer. Omit input_as_text only when the reply is just the mode. Do not use send_action or mode_select_* for that choice. If no mode is set yet and the user continues without choosing, omit interaction_mode and the server accepts clarify_first. Phrases like "Run it for me" or "auto-complete" in input_as_text switch the thread to auto_complete.

send_turn input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "thread_id",
    "interview_handle"
  ],
  "properties": {
    "thread_id": {
      "type": "string",
      "minLength": 1,
      "description": "Interview thread id from start_session."
    },
    "input_as_text": {
      "type": "string",
      "minLength": 1,
      "description": "User message text; omit for a style-only interaction_mode switch."
    },
    "interaction_mode": {
      "enum": [
        "auto_complete",
        "clarify_first"
      ],
      "type": "string",
      "description": "Interview style: clarify_first (Review each step) or auto_complete (Run it for me). Required for a style-only switch; when omitted with input_as_text, clarify_first is accepted by default."
    },
    "interview_handle": {
      "type": "string",
      "minLength": 1,
      "description": "Opaque interview handle from start_session. Pass it on every later tool."
    }
  }
}
send_turn output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "result": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "additionalProperties": {}
}
send_turn annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
send_action — Submit the pending choice
Advertised by the server during the last successful anonymous check.

Submit the user's pending choice. Set action_type to a value from pending_gate_payload.allowed_actions. In Review each step, action_type is required; confirmed_by_user=true is preferred and is not a substitute for it. In Run it for me, omit action_type and payload to advance one milestone, and do not ask the user to choose – show the user that milestone's Auto-complete decision receipt and pipe-table. Do not ask them to approve it. Call send_action once per result, and only again on the next result while next_tool is send_action. When next_tool is submit_prd, stop and offer submission. An approve moves one phase: stories to requirements, requirements to the technical spec, then the tech spec to the estimate. In Review each step, stories_reject, requirements_reject, and techspec_reject show the current table again and wait. When the user describes the change, call send_turn with their exact words and show the regenerated table that comes back. mode_select_a, mode_select_b, and mode_select_c are only the How much time pick: Normal, Quick estimate, or Detailed. Do not use them for Review each step or Run it for me. That choice is send_turn with interaction_mode. For clarifying_questions_submit, set payload.answers by question id with the letter only, such as {"q1":"A","q2":"B"}, not "1A". A plain reply such as "1B, 2A, 3C", or any wording that combines options, goes through send_turn. Do not split one question into several letters.

send_action input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "thread_id",
    "interview_handle"
  ],
  "properties": {
    "payload": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "thread_id": {
      "type": "string",
      "minLength": 1,
      "description": "Interview thread id from start_session."
    },
    "action_type": {
      "enum": [
        "clarifying_questions_submit",
        "mode_select_a",
        "mode_select_b",
        "mode_select_c",
        "interview_summary_accept",
        "interview_summary_update",
        "story_actions_update",
        "story_actions_looks_good",
        "stories_approve",
        "stories_reject",
        "requirements_approve",
        "requirements_reject",
        "techspec_approve",
        "techspec_reject"
      ],
      "type": "string",
      "description": "Widget action type from allowed_actions. Optional in auto_complete; defaults fill the pending gate."
    },
    "interview_handle": {
      "type": "string",
      "minLength": 1,
      "description": "Opaque interview handle from start_session. Pass it on every later tool."
    },
    "confirmed_by_user": {
      "type": "boolean",
      "description": "Preferred when the user explicitly chose. Not required when action_type is already set to an allowed_actions value with a complete payload."
    }
  }
}
send_action output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "result": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "additionalProperties": {}
}
send_action annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
get_estimate_status — Get app estimate progress
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read the current app cost estimate without advancing it. Returns flow_stage, pending_gate, and pending_gate_payload. After submission it also returns post_submit_notice and post_submit_links: relay the notice verbatim, keep every URL, and do not add an email-delivery caveat. Pass the thread_id and interview_handle from the Session section. Do not call start_session to recover a session, and do not use this tool to approve, edit, or submit.

get_estimate_status input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "thread_id",
    "interview_handle"
  ],
  "properties": {
    "thread_id": {
      "type": "string",
      "minLength": 1,
      "description": "Interview thread id from start_session."
    },
    "interview_handle": {
      "type": "string",
      "minLength": 1,
      "description": "Opaque interview handle from start_session. Pass it on every later tool."
    }
  }
}
get_estimate_status output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "result": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "additionalProperties": {}
}
get_estimate_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
submit_prd — Submit PRD and app estimate
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Submit the completed software PRD and app development estimate for email delivery and portal project creation. Call it only after user stories, requirements, tech specs, and the estimate exist. (flow_stage estimate). Run it for me stops at this tool. Offer submission and wait for the user. Do not submit it the way an empty send_action advances a milestone. Before calling, tell the user it emails the pack and creates a portal project. Propose first_name, last_name, email, country, and project_name already provided by the user, or a project name suggested by the tool. Show those values for confirmation and ask only for missing fields; if none are known, ask for all five. Set confirmed_by_user=true only after they confirm. Offer optional feedback and omit it if they skip. Never invent a contact field. If they decline, do not call this tool. Omit contact arguments the thread already collected. Pass the thread_id and interview_handle from the Session section. Success is only a ### PRD submitted receipt that includes project_id and version_id. Relay post_submit_notice verbatim, including every URL, and do not add an email-delivery caveat. A missing next_tool, a timeout, or an error is not success. If the result is unclear, call get_estimate_status. Do not call submit_prd again while that check is still unclear. Do not call submit_prd again after a receipt with both ids.

submit_prd input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "thread_id",
    "interview_handle"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
      "description": "Suggested or confirmed email from user context."
    },
    "country": {
      "type": "string",
      "minLength": 1,
      "description": "Suggested or confirmed home country from user context."
    },
    "feedback": {
      "type": "string",
      "description": "Optional notes from the user (scope, questions, extra context). Ask, but omit if they skip. Never invent this."
    },
    "last_name": {
      "type": "string",
      "minLength": 1,
      "description": "Suggested or confirmed surname from user context."
    },
    "thread_id": {
      "type": "string",
      "minLength": 1,
      "description": "Interview thread id from start_session."
    },
    "first_name": {
      "type": "string",
      "minLength": 1,
      "description": "Suggested or confirmed first name from user context."
    },
    "project_name": {
      "type": "string",
      "minLength": 1,
      "description": "Suggested or confirmed project name. Prefer values the user stated."
    },
    "interview_handle": {
      "type": "string",
      "minLength": 1,
      "description": "Opaque interview handle from start_session. Pass it on every later tool."
    },
    "confirmed_by_user": {
      "type": "boolean",
      "description": "Set true only after the user confirms the contact details (or corrects them)."
    },
    "interview_summary": {
      "type": "string",
      "description": "Optional override; normally loaded from the thread"
    }
  }
}
submit_prd output schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "result": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "additionalProperties": {}
}
submit_prd annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

chatstack-app-cost-estimator

Advertised by the server during the last successful anonymous check.

Estimate app and AI solution development costs and hours, scope an MVP, and generate a software PRD (Product Requirements Document) with user stories, requirements, and a technical specification. Use when the user asks for an app or software development cost estimate, a software quote, development hours, MVP scope, or a software PRD for an app idea. Do not use for definition-only questions such as “What is a PRD?”, code editing, calendar lookup, general project-management advice, or managing existing ChatStack portal projects.

chatstack-app-cost-estimator URI
skill://chatstack-app-cost-estimator/chatstack-app-cost-estimator/SKILL.md

MIME type: text/markdown

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
1834 ms
95th percentile latency
1834 ms

Maintenance history

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

  • · probe · passed · 1834 ms · metadata changed · 5 tool(s), 1 resource(s), 0 resource template(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 chatstack-app-cost-estimator-mcp https://mcp.chatstack.app/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 chatstack-app-cost-estimator-mcp --url https://mcp.chatstack.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable chatstack-app-cost-estimator-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "chatstack-app-cost-estimator-mcp": {
      "url": "https://mcp.chatstack.app/mcp"
    }
  }
}

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start chatstack-app-cost-estimator-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "chatstack-app-cost-estimator-mcp": {
      "type": "http",
      "url": "https://mcp.chatstack.app/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 chatstack-app-cost-estimator-mcp https://mcp.chatstack.app/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": {
    "chatstack-app-cost-estimator-mcp": {
      "url": "https://mcp.chatstack.app/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": {
    "chatstack-app-cost-estimator-mcp": {
      "serverUrl": "https://mcp.chatstack.app/mcp"
    }
  }
}

Let your agent find its tools

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

Do you run ChatStack App Cost Estimator MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing