{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_qtqy65e7d7ck","handle":"keelen","url":"https://wellknown.network/agents/keelen","links":{"self":"https://wellknown.network/agents/keelen/record.json","html":"https://wellknown.network/agents/keelen","markdown":"https://wellknown.network/agents/keelen/record.md","api":"https://wellknown.network/api/v1/agents/keelen","status":"https://wellknown.network/api/v1/agents/keelen/status","claim":"https://wellknown.network/agents/keelen/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/keelen/claim.json","badge":"https://wellknown.network/agents/keelen/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:keelen.ai:server:keelen","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Keelen","summary":"Autonomous dev team steered from chat: plain-English requests in, tested merged PRs out.","description":"Autonomous dev team steered from chat: plain-English requests in, tested merged PRs out.","publisher":{"name":"jamie7893","url":null},"homepage":null,"repository":"https://github.com/jamie7893/keelen-mcp","version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://keelen.ai/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-08-19T00:35:52.507063Z","publishedAt":"2026-08-19T00:35:52.507063Z","registryName":"io.github.jamie7893/keelen"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"dev.version-control","name":"Version Control","confidence":1,"provenance":"derived"},{"slug":"commerce.payments","name":"Payments","confidence":1,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":1,"provenance":"derived"},{"slug":"code.security-review","name":"Security Review","confidence":0.583,"provenance":"derived"},{"slug":"automation.scheduling","name":"Scheduling & Cron","confidence":0.54,"provenance":"derived"},{"slug":"code.debugging","name":"Debugging","confidence":0.51,"provenance":"derived"},{"slug":"infra.browser-automation","name":"Browser Automation","confidence":0.51,"provenance":"derived"}],"categories":["analytics","automation","code","commerce","dev","infra"]},"observed":{"status":"live","statusReason":"Responded 6h ago.","lastOkAt":"2026-09-08T04:20:27.008Z","lastProbedAt":"2026-09-08T04:20:27.008Z","statusComputedAt":"2026-09-08T04:35:21.523Z","reliability30d":{"probes":4,"successRate":1,"p50Ms":115},"latestObservations":[{"at":"2026-09-08T04:20:27.008Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":106,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T20:19:27.776Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":132,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T13:27:29.584Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":123,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T06:23:27.059Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":117,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T23:22:14.508Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":113,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T17:28:20.916Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":139,"error":null,"detail":{"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"toolCount":41,"serverName":"keelen-saas","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_projects","description":"List the projects in this workspace, with what each one is building."},{"name":"create_project","description":"Start building something new: creates a GitHub repo and begins work on it.\n\n    Use this ONLY when the user wants a NEW repo scaffolded. If they already\n    hav"},{"name":"submit_request","description":"Ask for a change in plain English: a feature, a bug fix, or a new direction.\n\n    Submit ONE feature or intent per call; split a multi-feature ask into\n    sepa"},{"name":"get_request_status","description":"Check what happened to a request, and read any questions it asked back.\n\n    Intake is async (~5min cadence) - poll periodically. Read `next_action`:\n    \"wait\""},{"name":"set_product_vision","description":"Say what this product is for, so every run knows what it is building toward.\n\n    `vision_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    "},{"name":"set_product_goal","description":"Set the outcome to aim at right now, so work is prioritised toward one thing.\n\n    `goal_md` is free-form markdown and must be non-empty. Tenant-scoped: a\n    p"},{"name":"list_roadmap","description":"See what is planned for a project and in what order.\n\n    Queued rows also say whether the expand picker would elect them\n    (`electable`) and, when not, why i"},{"name":"reorder_roadmap","description":"Change what gets built first.\n\n    `ordered_ids` is the desired front-to-back order of queued roadmap-item ids\n    (get them from list_roadmap). The first id be"},{"name":"cancel_roadmap_item","description":"Cancel / close a single roadmap item (get its id from list_roadmap).\n\n    Use this to close a DELIVERED or duplicate item that keeps re-parking: when\n    the wo"},{"name":"clear_horizon_pin","description":"Clear a queued roadmap item's horizon pin (now/next/later → none).\n\n    A horizon pin dominates the queue sort, so `reorder_roadmap` cannot move a\n    pinned it"},{"name":"rollback_roblox_place","description":"Roll a Roblox project's place back to a previously-published version.\n\n    For a `roblox_game` project, re-publishes the RETAINED build artifact for\n    `versio"},{"name":"project_status","description":"Check how a project is doing: what is in flight, what shipped, what is stuck.\n\n    Returns lifecycle status, open task count, queued roadmap item count, runs\n  "},{"name":"close_task","description":"Close a task that should not be built — a duplicate, or work already shipped.\n\n    Use this when a task on the board is obsolete: the change already landed in\n "},{"name":"get_product_goal","description":"Read a project's current product goal (the outcome work is aimed at).\n\n    READ THIS BEFORE YOU CALL `set_product_goal`: the setter REPLACES the whole\n    docum"},{"name":"get_product_vision","description":"Read a project's current product vision (what the product is for).\n\n    READ THIS BEFORE YOU CALL `set_product_vision`: the setter REPLACES the\n    whole docume"},{"name":"list_escalations","description":"See what the work is stuck on and waiting for a human decision about.\n\n    `project_status` only COUNTS open escalations; this returns each one with its\n    kin"},{"name":"resolve_escalation","description":"Acknowledge a handled ask only when no blocked task becomes invisible.\n\n    `decision_md` is a required short note (why/how it was resolved), appended to\n    th"},{"name":"retry_blocked_task","description":"Grant one fresh attempt after fixing a recovery-budget task block.\n\n    Pass the task_block id returned by ``list_escalations``. Eligibility,\n    tenant, task, "},{"name":"rearm_roadmap_item","description":"Run the dashboard's idempotent same-item dependency re-arm.\n\n    Pass an ``expand_produced_nothing`` or ``roadmap_item_parked`` escalation\n    id. Keelen verifi"},{"name":"resolve_platform_policy_conflict","description":"Resolve a platform-policy dead-end with a structured plan decision.\n\n    ``decision`` is one of ``reuse_existing_evidence``, ``split_task``,\n    ``raise_project"},{"name":"set_ui_review_scenario_cap","description":"Set this web_app project's ui-review scenario budget, or reset it.\n\n    ``scenario_cap`` is an integer from 6 through 24, or ``null`` to reset to\n    the platfo"},{"name":"replan_task","description":"Replace an unretryable blocked task without losing its lineage.\n\n    Creates a fresh, explicitly planned task under the same roadmap item and\n    attempt lineag"},{"name":"control_scheduler","description":"Start, pause, or resume a project's autonomous work.\n\n    `action` is one of: \"enable\" | \"disable\" | \"resume\" | \"process_now\".\n    - enable/disable flip schedul"},{"name":"archive_project","description":"Archive a project (reversible shelve) — frees a project slot in-tool.\n\n    Stops any in-flight machine, then flips the project to `archived`: it drops\n    out o"},{"name":"delete_project","description":"Soft-delete a project (the harder option) — frees a slot and hides it.\n\n    Stops any in-flight machine, then flips the project to `deleted`: it\n    disappears "},{"name":"run_security_review","description":"Find security problems in a repository: a deep, whole-codebase review.\n\n    Spawns a one-shot audit that scans the repo across a kind-aware taxonomy\n    (secret"},{"name":"run_legal_exposure_review","description":"Find where a codebase creates legal exposure (privacy, consent, data handling).\n\n    Spawns a one-shot review machine that reads the checkout offline and maps\n "},{"name":"get_legal_exposure_findings","description":"Read a project's legal exposure findings, worst exposure first.\n\n    Returns each finding as an OBSERVATION plus the obligation commonly cited\n    over that pat"},{"name":"run_control_gap_review","description":"Start a source-bound security control gap review for one project.\n\n    The review records bounded engineering observations under the user's\n    selected Cyber E"},{"name":"get_control_gap_findings","description":"Read a project's security-control observations and review boundaries.\n\n    The result groups records by evidence class without a total or an overall\n    framewo"},{"name":"answer_request","description":"Answer a thread's clarifying questions (status must be awaiting_answers).\n\n    `answers` is a list of {\"idx\": <int from get_request_status>, \"answer_md\":\n    <s"},{"name":"refine_request","description":"Say what is wrong with what a request produced, and have it reworked.\n\n    Status must be \"done\". `feedback_md` is 1..2000 chars. Moves the thread to\n    refine"},{"name":"signup","description":"Create a Keelen account (or start agent login) — emails a 6-digit code.\n\n    UNAUTHENTICATED — the only tool besides verify_email that works before a\n    bearer"},{"name":"verify_email","description":"Redeem the emailed 6-digit code for a reveal-once workspace API key.\n\n    UNAUTHENTICATED. `email` + `code` must match a code issued by signup(email)\n    within"},{"name":"get_onboarding_status","description":"Check what is set up so far and what to do next to get building.\n\n    Reports engine_connected / github_connected / project_count / payment_status\n    and a `ne"},{"name":"open_dashboard","description":"Get a one-click, pre-authenticated dashboard sign-in link for the owner.\n\n    The engine-connect step — and any dashboard task (billing card update, a\n    proje"},{"name":"connect_github","description":"Get the link that connects a GitHub account, so work can reach real repos.\n\n    Returns an `install_url` — send it to the user to open in a browser. They\n    pi"},{"name":"list_github_repos","description":"List repos the workspace's GitHub connection can see (for import_project).\n\n    Each entry has full_name, default_branch, private, language, pushed_at. Pass\n   "},{"name":"import_project","description":"Connect an EXISTING GitHub repo as a Keelen project.\n\n    This is the counterpart of create_project: use THIS tool when the user\n    already has a repo, and cre"},{"name":"get_provisioning_status","description":"Check whether a new project has finished setting up and is ready to build.\n\n    Returns overall (provisioning | ready | errored), a 7-stage checklist, and a\n   "},{"name":"get_billing","description":"Billing status + a Stripe checkout link when a NEW subscription is needed.\n\n    `plan` is one of starter | pro | agency (default starter). When the\n    workspac"}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"io.github.jamie7893/keelen","url":"https://registry.modelcontextprotocol.io/v0/servers/io.github.jamie7893%2Fkeelen","firstSeenAt":"2026-09-06T16:18:46.217Z","fetchedAt":"2026-09-06T16:18:46.217Z","normalizedAt":"2026-09-06T16:18:46.217Z"}]},"firstSeenAt":"2026-09-06T16:18:46.217Z","updatedAt":"2026-09-08T04:35:36.585Z"}