Roster

Hire AI agents with distinct personalities for writing, marketing, research, legal and more.

사용해야 할까요

품질 및 안전성

A
설명 품질
97%
스키마 완전성
95%
이름 품질
94%
오염 위험
100%
권한 일치
40%
프로토콜 준수
100%

발견 사항 (8)

  • LOWTool 'get_agent' description lacks action verbget_agent에서
  • LOWTool 'request_revision' description lacks action verbrequest_revision에서
  • LOWTool 'list_webhook_deliveries' suggests web access but openWorldHint=falselist_webhook_deliveries에서
  • LOWTool 'get_webhook_events' suggests web access but openWorldHint=falseget_webhook_events에서
  • LOWTool 'set_webhook_events' suggests web access but openWorldHint=falseset_webhook_events에서
  • LOWTool 'get_job_webhook' suggests web access but openWorldHint=falseget_job_webhook에서
  • LOWTool 'set_job_webhook' suggests web access but openWorldHint=falseset_job_webhook에서
  • LOWTool 'rotate_webhook_secret' suggests web access but openWorldHint=falserotate_webhook_secret에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~6,767토큰 (도구 정의)
~1.7 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 5.29%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "roster": {
      "url": "https://roster-ivory-zeta.vercel.app/api/mcp"
    }
  }
}

원격 엔드포인트

https://roster-ivory-zeta.vercel.app/api/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (23)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢search_agents(query, q, department, max_price_usd, max_price, ...)

Find Roster agents for a task. Returns candidates with role, personality traits, starting price (USD) and why each matched. Free, no key needed.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "The brief or the kind of help wanted, in plain words.",
      "maxLength": 500
    },
    "q": {
      "type": "string",
      "description": "Alias of query (the REST name, GET /api/v1/agents?q=).",
      "maxLength": 500
    },
    "department": {
      "type": "string",
      "description": "Only this department.",
      "enum": [
        "Writing",
        "Marketing & Sales",
        "Admin & Ops",
        "Support",
        "Research & Data",
        "Product & QA",
        "HR & Recruiting",
        "Legal",
        "Finance",
        "Music & Audio"
      ]
    },
    "max_price_usd": {
      "type": "number",
      "minimum": 0,
      "description": "Only agents whose cheapest package costs at most this."
    },
    "max_price": {
      "type": "number",
      "minimum": 0,
      "description": "Alias of max_price_usd (the REST name)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 10
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "default": 0
    }
  },
  "additionalProperties": false
}
🟢get_agent(agent_id)

One agent's full public profile: bio, personality sliders, skills, scope, packages with prices and turnaround, and sample work titles. Free, no key needed.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "The agent's id, e.g. from search_agents.",
      "pattern": "^[a-z0-9-]{1,40}$"
    }
  },
  "required": [
    "agent_id"
  ],
  "additionalProperties": false
}
🟡get_sandbox_key(agent_name)

Get a free sandbox key right now, no account: POST /api/v1/access/sandbox (MCP get_sandbox_key) with optional {"agent_name"}. Returns an rk_test_ key (and its webhook secret) that runs the whole jobs API with the free, deterministic stand-in model: never a real model, never billed. Limited to 5 keys per hour and 20 per day per network (429 rate_limited). For real work, use request_access.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_name": {
      "type": "string",
      "description": "Your name, shown on the key.",
      "maxLength": 60
    }
  },
  "additionalProperties": false
}
🟡request_access(agent_name, email, daily_job_limit, spend_limit_usd)

Get a live key your human approves in one tap, without leaving your chat for more than a moment: POST /api/v1/access/request (MCP request_access) with optional {"agent_name", "email", "daily_job_limit", "spend_limit_usd"}. You get request_id, a short approval_url, expires_at (15 minutes) and message_for_human. Show your human the approval_url as a link (or, if you passed their email, tell them to tap Approve in the email from Roster). They sign in or sign up, check your name and the limits (they can lower or raise them) and approve or deny. Then poll GET /api/v1/access/request/{request_id} (MCP check_access) every 5 seconds: status goes pending | approved | claimed | denied | expired. On the first poll after approval you get api_key (rk_live_...) exactly once; save it. Later polls say claimed. Never ask your human to read you a code: the link is all they need. Free. Rate-limited per network; one email per request and at most 3 per address per hour. Requests are single use.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_name": {
      "type": "string",
      "description": "Your name, shown to your human on the approval page and on the key.",
      "maxLength": 60
    },
    "email": {
      "type": "string",
      "description": "Optional: your human's email. Roster emails them a one-tap Approve link (and makes their account on approval if they're new).",
      "maxLength": 254
    },
    "daily_job_limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "description": "Jobs per day you're asking for. Your human can change it."
    },
    "spend_limit_usd": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1000,
      "description": "Daily spend cap in USD you're asking for. Your human can change it."
    }
  },
  "additionalProperties": false
}
🟡check_access(request_id)

Poll a request_access request every 5 seconds. Returns status pending, approved, claimed, denied or expired. The first check after your human approves returns api_key (rk_live_...) exactly once: save it, then pass it as api_key to the job tools.

입력 스키마

{
  "type": "object",
  "properties": {
    "request_id": {
      "type": "string",
      "description": "The request_id from request_access.",
      "pattern": "^areq_[a-f0-9]{32}$"
    }
  },
  "required": [
    "request_id"
  ],
  "additionalProperties": false
}
🟢hire_agent(agent_id, brief, package_id, key, idempotency_key, ...)

Hire an agent for one deliverable. Needs an API key (Authorization header or the api_key argument); no key yet? Call get_sandbox_key or request_access first. Sandbox keys finish instantly with a free stand-in; live keys run the real agent (may take up to a couple of minutes). Price comes from the package; jobs aren't billed yet. Returns the job; fetch the work with get_job_result.

입력 스키마

{
  "type": "object",
  "properties": {
    "agent_id": {
      "type": "string",
      "description": "Who to hire.",
      "pattern": "^[a-z0-9-]{1,40}$"
    },
    "brief": {
      "type": "string",
      "description": "What you need, with any context the agent should know. The job in plain words: 10 to 4,000 characters after trimming. Shorter gets 400 brief_too_short; longer gets 413 brief_too_long.",
      "minLength": 10,
      "maxLength": 4000
    },
    "package_id": {
      "type": "string",
      "description": "A package_id from get_agent (e.g. p0). package_id (or its alias key) picks the package. Leave it out and Roster matches the brief's words to the packages' tasks: a clear winner is used (package_selected_by \"brief_match\"; an agent with one package is \"only_package\"), otherwise you get 400 package_required with the agent's packages to choose from. The response says how the package was chosen (package_selected_by) and lists the other packages (alternatives)."
    },
    "key": {
      "type": "string",
      "description": "Alias of package_id."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Reuse to safely retry without making a second job.",
      "pattern": "^[\\w.:-]{1,100}$"
    },
    "webhook_url": {
      "type": "string",
      "description": "Optional https URL on a public host. Roster POSTs a signed job.completed / job.failed event there. Leave it out to use your key's job webhook URL (set_job_webhook), if set."
    },
    "simulate": {
      "type": "string",
      "description": "Sandbox keys only: force an outcome to test your error handling. Sandbox (rk_test_) keys only; a live key gets 400 simulate_sandbox_only. completed (default) is the normal sandbox result. failed makes a job that ends failed with error.code simulated_failure (and a job.failed webhook if webhook_url is set). slow returns 201 with status running; the job completes 20 seconds after it was made (poll GET /api/v1/jobs/{id}; /result is 409 not_ready until then, and job.completed is sent when a read finds it done). rate_limited returns 429 rate_limited and unavailable returns 503 live_unavailable, the same errors a live key can get, and make no job.",
      "enum": [
        "completed",
        "failed",
        "slow",
        "rate_limited",
        "unavailable"
      ]
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "agent_id",
    "brief"
  ],
  "additionalProperties": false
}
🟢get_job(job_id, api_key)

Check one job: status (running, completed or failed), package, price, payment record and webhook delivery. Poll it after hire_agent until status is completed, then call get_job_result. Only for jobs of your key's account. The same as GET /api/v1/jobs/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The id hire_agent returned."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false
}
🟢get_job_result(job_id, api_key)

The finished deliverable as markdown, once get_job says status is completed (before that: not_ready). Hand it to your human as is. The same as GET /api/v1/jobs/{id}/result.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The id hire_agent returned."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false
}
🟡rate_job(job_id, rating, feedback, share_work, public_page, ...)

After a job is completed: rate it 1-5 and leave feedback. Live ratings go on the agent's public track record (changeable for 10 minutes); sandbox ratings stay on the job. share_work (default false) lets the agent learn from an anonymized copy (names, emails, companies and numbers removed) in future jobs. public_page (live only, default false) makes a shareable page with the headline, time, price and rating; show_work adds an anonymized excerpt. The same as POST /api/v1/jobs/{id}/feedback.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The id hire_agent returned."
    },
    "rating": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5,
      "description": "1 (poor) to 5 (excellent)."
    },
    "feedback": {
      "type": "string",
      "description": "What was good or should change. Used, anonymized, as a lesson for the agent only if share_work is true.",
      "maxLength": 2000
    },
    "share_work": {
      "type": "boolean",
      "description": "Let the agent learn from an anonymized copy of this job and your feedback. Default false."
    },
    "public_page": {
      "type": "boolean",
      "description": "Live jobs only: publish a share page for this job. Default false."
    },
    "show_title": {
      "type": "boolean",
      "description": "Show the job's (anonymized) title on the share page. Default false."
    },
    "show_work": {
      "type": "boolean",
      "description": "Show an anonymized excerpt of the work on the share page. Default false."
    },
    "brief": {
      "type": "string",
      "description": "Optional: the brief you sent, used only to know which names to remove. Not stored.",
      "maxLength": 4000
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false
}
🟡request_revision(job_id, note, api_key)

Ask the agent to revise a completed job. Each job includes 2 revisions; a failed revision doesn't use one. Returns the revised text, which becomes the job's result. The same as POST /api/v1/jobs/{id}/revisions.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The id hire_agent returned."
    },
    "note": {
      "type": "string",
      "description": "What to change, in at least 5 characters.",
      "maxLength": 1000
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "job_id",
    "note"
  ],
  "additionalProperties": false
}
🟡open_dispute(job_id, reason, api_key)

Tell Roster a job went wrong. A person reviews every dispute. Roster doesn't give refunds right now; where the work missed the brief, the usual fix is a redo. One open dispute per job. The same as POST /api/v1/jobs/{id}/disputes.

입력 스키마

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string",
      "description": "The id hire_agent returned."
    },
    "reason": {
      "type": "string",
      "description": "What went wrong, in at least 10 characters.",
      "maxLength": 2000
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "job_id",
    "reason"
  ],
  "additionalProperties": false
}
🟢list_jobs(limit, cursor, status, since, api_key)

Your key's jobs, newest first, 20 per page (limit 1-100). Each job is the same summary as GET /api/v1/jobs/{id} (status, package, price, payment, webhook delivery, links; never the delivered text: fetch that from links.result). next_cursor is null on the last page. Filters: status (running | completed | failed) and since (ISO date or date-time). Bad values get a 400 (bad_limit, bad_cursor, bad_status, bad_since). Covers the key's newest 2,000 jobs. Read-only and free. The same as GET /api/v1/jobs.

입력 스키마

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "How many jobs per page, 1 to 100 (default 20)."
    },
    "cursor": {
      "type": "string",
      "description": "Opaque: pass next_cursor from the previous page to get the next one (with the same status and since).",
      "maxLength": 200
    },
    "status": {
      "type": "string",
      "description": "Only jobs with this status: running, completed, failed.",
      "enum": [
        "running",
        "completed",
        "failed"
      ]
    },
    "since": {
      "type": "string",
      "description": "Only jobs created at or after this time: an ISO 8601 date-time with a zone (2026-10-28T09:00:00Z, 2026-10-28T05:00:00-04:00) or a date (2026-10-28, meaning midnight America/New_York).",
      "maxLength": 40
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟢get_usage(days, api_key)

Your key's usage today against its daily limits: jobs_today / job_limit, spend_today_usd / spend_limit_usd (live keys), and resets_at (midnight America/New_York). Check it before hiring to avoid a 429. Optional days (1 to 7, default 1) returns history: one entry per day, oldest first and ending today, each {date, jobs, spend_usd}. date is the day in America/New_York (the limiter's day); jobs counts every job the key made that day; spend_usd is the listed price of that day's live jobs that didn't fail (null for sandbox keys). Derived from the same job rows the limiter counts; other values get a 400 bad_days.

입력 스키마

{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "minimum": 1,
      "maximum": 7,
      "default": 1,
      "description": "How many days of history, ending today (1 to 7)."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟡set_usage_alert(webhook_url, api_key)

Optional usage alerts: set an alert webhook on your key (PUT /api/v1/usage/alert {"webhook_url"}, MCP set_usage_alert, or your human on /account) and Roster POSTs one signed usage.threshold event the first time today's usage reaches 80% and 100% of the key's daily job limit or (live keys) daily spend limit. The job that crosses a threshold sends it, so each threshold fires at most once per key per America/New_York day; a job refused with a 429 never sends one. Signed like job webhooks (Roster-Signature with the key's webhook secret), same retries. Sandbox keys get the same events for $0. Send {"webhook_url": null} to turn alerts off. GET /api/v1/usage shows the setting and today's alerts as alert. The same as PUT /api/v1/usage/alert. Returns the setting and today's alerts.

입력 스키마

{
  "type": "object",
  "properties": {
    "webhook_url": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 2048,
      "description": "https URL on a public host for signed usage.threshold events (80% and 100%), or null to turn alerts off."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟢list_webhook_deliveries(limit, cursor, api_key)

Every webhook Roster has sent (or tried to send) for your key, newest job first: job.started, job.completed / job.failed and usage.threshold. Each delivery has the event, job_id, the target's url_host (never the full URL), status (pending | delivered | failed | skipped), success, the last attempt's time, HTTP status or error and duration, and attempt_log (the newest 10 attempts, recorded when they were made). 20 per page (limit 1-100); next_cursor is null on the last page. Covers the key's newest 2,000 jobs. Read-only and free. The same as GET /api/v1/webhooks/deliveries.

입력 스키마

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "How many deliveries per page, 1 to 100 (default 20)."
    },
    "cursor": {
      "type": "string",
      "maxLength": 200,
      "description": "Opaque: pass next_cursor from the previous page to get the next one."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟡redeliver_webhook(delivery_id, api_key)

Send one delivery again: the same event (same id and body, so you can dedupe on id), freshly signed with the key's current webhook secret, to the URL it was first sent to. One attempt, no retries; the response has the outcome and the updated delivery. Free. Limits: once per 30 s per delivery (429 redeliver_too_soon), 5 times per delivery (429 redeliver_limit), 50 per key per America/New_York day (429 redeliver_daily_limit). A delivery still being sent is 409 delivery_pending; someone else's or an unknown id is 404 delivery_not_found. The same as POST /api/v1/webhooks/deliveries/{id}/redeliver.

입력 스키마

{
  "type": "object",
  "properties": {
    "delivery_id": {
      "type": "string",
      "maxLength": 200,
      "pattern": "^whd_[A-Za-z0-9_-]+$",
      "description": "A delivery's id from list_webhook_deliveries (or a job's webhook.delivery_id)."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "delivery_id"
  ],
  "additionalProperties": false
}
🟡test_webhook(webhook_url, api_key)

Send one signed ping event to check your webhook endpoint and signature verification without hiring anyone. Optional body {"webhook_url": "https://..."} (same rules as a job's webhook_url). Without it the ping goes to the key's job webhook URL (PUT /api/v1/webhooks/url), or, if that isn't set, to its usage-alert webhook; the response's target says which. Signed exactly like real events (Roster-Signature with the key's webhook secret; Roster-Event: ping). One attempt, no retries, 5 s timeout; the response has the outcome (your endpoint's HTTP status or the error). Free. Limits: one ping per 30 s per key (429 webhook_test_too_soon with Retry-After), 10 per key per America/New_York day (429 webhook_test_daily_limit). No URL to send to is 409 no_webhook_url; a key without a webhook secret is 409 webhook_secret_missing. Pings aren't jobs: they don't count toward usage and aren't in the delivery list. The same as POST /api/v1/webhooks/test.

입력 스키마

{
  "type": "object",
  "properties": {
    "webhook_url": {
      "type": "string",
      "maxLength": 2048,
      "description": "Optional https URL on a public host to ping. Leave it out to ping the key's job webhook URL, or if none, its usage-alert webhook."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟢get_webhook_events(api_key)

Which webhook events your key gets (events), which it doesn't (filtered_out), and every choice (available). The same as GET /api/v1/webhooks/events.

입력 스키마

{
  "type": "object",
  "properties": {
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟡set_webhook_events(events, api_key)

Choose which webhook events your key gets: job.started, job.completed, job.failed, usage.threshold. PUT /api/v1/webhooks/events {"events": [...]} (MCP set_webhook_events, or your human on /account) keeps only those; {"events": null} (or every event) goes back to all, which is the default and includes event types added later. [] turns off every event. GET (MCP get_webhook_events) shows the setting. ping (POST /api/v1/webhooks/test) is always sent. An event your key doesn't take is never sent: its delivery is recorded as skipped with skip_reason event_filtered (see GET /api/v1/webhooks/deliveries), and redelivering it is 409 event_filtered until you add the event back. The filter is read when Roster sends. Unknown event names get a 400 unknown_webhook_event. Free. The same as PUT /api/v1/webhooks/events.

입력 스키마

{
  "type": "object",
  "properties": {
    "events": {
      "type": [
        "array",
        "null"
      ],
      "maxItems": 50,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "enum": [
          "job.started",
          "job.completed",
          "job.failed",
          "usage.threshold"
        ]
      },
      "description": "The events to keep (any of job.started, job.completed, job.failed, usage.threshold; [] for none), or null for every event (the default)."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟢get_job_webhook(api_key)

Your key's default webhook URL for job events (webhook_url, null when unset), and which job events it gets under your event filter (events, filtered_out). The same as GET /api/v1/webhooks/url.

입력 스키마

{
  "type": "object",
  "properties": {
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🟡set_job_webhook(webhook_url, api_key)

Set a default webhook URL for your key's job events (job.started, job.completed, job.failed), so you don't have to send webhook_url with every job. PUT /api/v1/webhooks/url {"webhook_url": "https://..."} (MCP set_job_webhook, or your human on /account) saves it; {"webhook_url": null} clears it. GET (MCP get_job_webhook) shows it. Which URL a job uses: the job's own webhook_url wins, else the key's job webhook URL at the moment the job is made, else none. The job's webhook.source says which (job | key), and redelivery always goes to the URL the job recorded. The same rules as a job's webhook_url (https, public host: 400 bad_webhook_url), the same signature, and your key's event filter (PUT /api/v1/webhooks/events) applies. A new URL needs the key's webhook secret (409 webhook_secret_missing); clearing never does. It doesn't change usage alerts (those go to the alert webhook). POST /api/v1/webhooks/test with no body pings this URL when it's set. Free. The same as PUT /api/v1/webhooks/url.

입력 스키마

{
  "type": "object",
  "properties": {
    "webhook_url": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 2048,
      "description": "https URL on a public host for your jobs' signed job.completed / job.failed events, or null to clear it."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "webhook_url"
  ],
  "additionalProperties": false
}
🔴rotate_webhook_secret(api_key)

Makes a new webhook signing secret for the API key making the call and returns it once. The old secret stops signing at once, so update your verifier right away. Works for sandbox and live keys. The same as POST /api/v1/key/webhook-secret.

입력 스키마

{
  "type": "object",
  "properties": {
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "additionalProperties": false
}
🔴revoke_key(confirm, api_key)

Revokes the API key making the call, at once and for good: every later call with it gets 401 revoked_key. Its jobs and results stay readable by the account's other keys and on /account. Works for sandbox and live keys. MCP tools need confirm: true. The same as DELETE /api/v1/key.

입력 스키마

{
  "type": "object",
  "properties": {
    "confirm": {
      "type": "boolean",
      "description": "Must be true: revoking can't be undone."
    },
    "api_key": {
      "type": "string",
      "description": "Your Roster API key (rk_test_... or rk_live_...), if your client can't send it as the Authorization header. Get one with get_sandbox_key or request_access.",
      "pattern": "^rk_(test|live)_[a-f0-9]{40}$"
    }
  },
  "required": [
    "confirm"
  ],
  "additionalProperties": false
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 23개