# me.ceki/mcp-server (remote · api.ceki.me)

Hire specialists by the hour — search, schedule, and pay via MCP protocol.

- Trust score: 70/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.ceki.me`: 70/100 (this document), [markdown](https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent.md), [page](https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent)

## Channel facts

- Endpoint: `https://api.ceki.me/mcp/agent`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 50 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 79/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5335 tokens (~102/item across 52 items; 50 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http me-ceki-mcp-server https://api.ceki.me/mcp/agent
```

### Codex

```toml
[mcp_servers.me-ceki-mcp-server]
url = "https://api.ceki.me/mcp/agent"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "me-ceki-mcp-server": {
      "type": "remote",
      "url": "https://api.ceki.me/mcp/agent",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add me-ceki-mcp-server --url https://api.ceki.me/mcp/agent --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  me-ceki-mcp-server:
    url: "https://api.ceki.me/mcp/agent"
```

### Other

```json
{
  "mcpServers": {
    "me-ceki-mcp-server": {
      "type": "http",
      "url": "https://api.ceki.me/mcp/agent"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 69, 0)

- [functional] New tool “upload-file”
- [functional] New tool “remove-contract-member”
- [cosmetic] “propose-correction” added an optional parameter “files”

### 2026-07-31 (score 69, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 69, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 67, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 66)

First indexed and scored.

## MCP tools (50)

### `register-agent` (~281 tokens)

Register Agent

[Public] Register a new agent. Returns API key, wallet with deposit address and required amount immediately. Email verification is optional but required to access user profiles.

Input parameters:

- `avatar` (string|null): Avatar URL
- `callback_url` (string|null): Callback URL
- `currency` (string): Currency for wallet (CHAIN-TOKEN format, e.g. ETH-USDT)
- `description` (string|null): Agent description
- `email` (string, required): Agent email
- `env_requirements` (array|null): Environment requirements
- `example_requests` (array|null): Example requests
- `example_responses` (array|null): Example responses
- `input_formats` (array|null): Input formats
- `languages` (array|null): Languages
- `last_updated_at` (string|null): Last updated date
- `license` (string|null): License
- `limitations` (string|null): Limitations
- `links` (array|null): List of links
- `name` (string, required): Agent name
- `owner_email` (string|null): Owner email
- `privacy_url` (string|null): Privacy URL
- `skills` (array|null): List of skills
- `sla` (string|null): SLA
- `tags` (array|null): Tags
- `version` (string|null): Agent version
- `website_url` (string|null): Website URL

### `verify-email` (~58 tokens)

Verify Email

[Public] Mandatory: confirm email with the 6-digit code to activate the agent (or transition to pending_deposit if balance < required).

Input parameters:

- `code` (string, required): 6-digit verification code
- `email` (string, required): Agent email

### `resend-verification` (~27 tokens)

Resend Verification

[Public] Resend email verification code.

Input parameters:

- `email` (string, required): Agent email

### `regenerate-key` (~39 tokens)

Regenerate API Key

[Auth Required] Regenerate the API key. Old key is immediately invalidated. Pass API key via X-Agent-Key header or Authorization: Bearer.

### `search-specialists` (~350 tokens)

Search Specialists

[Auth Required + Active] Search for specialists indexed in Meilisearch (full-text). The `query` parameter matches against label, description, skill names and languages — use it for skill-by-name search. Paid action (api_search). Pass API key via X-Agent-Key or Authorization: Bearer.

Input parameters:

- `currency` (string|null): Price currency filter
- `days` (array|null): Filter by available days (ISO 1-7, Mon=1, Sun=7)
- `descending` (boolean|null): Sort descending
- `duration` (integer|null): Required duration in minutes
- `end` (string|null): Available until date (YYYY-MM-DD)
- `hours_end` (string|null): Filter by availability end time (HH:MM)
- `hours_start` (string|null): Filter by availability start time (HH:MM)
- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page
- `price_from` (integer|null): Minimum price per hour
- `price_to` (integer|null): Maximum price per hour
- `query` (string|null): Free-text search (Meilisearch). Matches against label, description, skill names (e.g. "Python", "SEO"), language names. Use this for skill-by-name search instead of `skills` array.
- `skills` (array|null): Optional filter by exact skill IDs. Use only when you already know IDs. For text/name-based skill search, prefer `query` parameter.
- `sortBy` (string|null): Sort field
- `start` (string|null): Available from date (YYYY-MM-DD)
- `timezone` (string|null): Timezone filter

### `get-user` (~60 tokens)

Get User Profile

[Auth Required + Active] Get user profile by ID (paid action: api_user_view after free limit). Requires active account (deposit verified). Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `id` (integer, required): User ID

### `get-pricing` (~44 tokens)

Get Pricing

[Public] Get current pricing for agent actions, subscriptions, and deposit settings (amounts, minimum). USD-denominated. Use get-crypto-list for available crypto pairs.

### `get-crypto-list` (~63 tokens)

Get Crypto List

[Public] Get available crypto currency pairs in BLOCKCHAIN-CURRENCY format (e.g. ETH-USDT, TRX-USDT) from the active payment gateway. Use this list as the `currency` value in create-topup-invoice and select-currency.

### `get-profile` (~34 tokens)

Get Agent Profile

[Auth Required] Get the authenticated agent's profile information. Pass API key via X-Agent-Key header or Authorization: Bearer.

### `update-profile` (~185 tokens)

Update Agent Profile

[Auth Required] Update the authenticated agent's profile. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `avatar` (string|null): Avatar URL
- `callback_url` (string|null): Callback URL
- `description` (string|null): Agent description
- `input_formats` (array|null): Input formats
- `languages` (array|null): Languages
- `license` (string|null): License
- `limitations` (string|null): Limitations
- `links` (array|null): List of links
- `name` (string|null): Agent name
- `privacy_url` (string|null): Privacy URL
- `skills` (array|null): List of skills
- `sla` (string|null): SLA
- `tags` (array|null): Tags
- `version` (string|null): Agent version
- `website_url` (string|null): Website URL

### `get-wallet` (~61 tokens)

Get Wallet

[Auth Required] Get the authenticated agent's wallet information with active deposit invoice. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `currency` (string): Currency in BLOCKCHAIN-CURRENCY format (optional, defaults to highest-balance wallet)

### `select-currency` (~68 tokens)

Select Wallet Currency

[Auth Required] Select currency and get wallet with top-up info. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `currency` (string, required): Currency in BLOCKCHAIN-CURRENCY format (e.g. ETH-USDT). Use get-crypto-list to see available options.

### `get-wallet-transactions` (~56 tokens)

Get Wallet Transactions

[Auth Required] Get the authenticated agent's wallet transactions. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `limit` (integer|null): Pagination limit
- `offset` (integer|null): Pagination offset

### `get-wallet-usage` (~37 tokens)

Get Wallet Usage

[Auth Required] Get the authenticated agent's API usage statistics. Pass API key via X-Agent-Key header or Authorization: Bearer.

### `request-withdrawal` (~94 tokens)

Request Withdrawal

[Auth Required + Active] Request a cryptocurrency withdrawal from your agent wallet. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `address` (string, required): Destination wallet address
- `amount` (number, required): Amount to withdraw (in USD equivalent)
- `currency` (string, required): Cryptocurrency to withdraw (CHAIN-TOKEN, e.g. ETH-USDT)
- `note` (string|null): Optional note

### `create-topup-invoice` (~93 tokens)

Create Topup Invoice

[Auth Required] Create a top-up invoice to deposit funds. Currency must be in BLOCKCHAIN-CURRENCY format (e.g. ETH-USDT). Returns crypto deposit address.

Input parameters:

- `amount_usd` (number, required): Amount in USD (minimum 5)
- `currency` (string, required): Currency in BLOCKCHAIN-CURRENCY format (e.g. ETH-USDT). Use get-crypto-list to see available options.

### `get-owner-connect-link` (~44 tokens)

Get Owner Connect Link

[Auth Required] Generate a one-time link for an owner to bind this agent to their account. No invoice or payment required. The owner visits the link to connect.

### `get-schedules` (~59 tokens)

Get Schedules

[Auth Required] Get the authenticated agent's schedules (paginated). Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page

### `create-schedule` (~146 tokens)

Create Schedule

[Auth Required] Create a new agent schedule (paid action: schedule_create). Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `end` (string|null): End date (YYYY-MM-DD or ISO 8601)
- `kal_id` (integer, required): Calendar ID to attach the schedule to
- `private` (boolean|null): Whether the schedule is private
- `settings` (object, required): Schedule settings (events, days, hours, contacts, skills, links, etc.)
- `start` (string, required): Start date (YYYY-MM-DD or ISO 8601)
- `timezone` (string|null): Timezone (e.g. Europe/Moscow, UTC)

### `get-schedule` (~44 tokens)

Get Schedule

[Auth Required] Get a specific agent schedule by ID. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `id` (integer, required): Schedule ID

### `update-schedule` (~99 tokens)

Update Schedule

[Auth Required] Update an existing agent schedule. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `end` (string|null): New end date
- `id` (integer, required): Schedule ID
- `private` (boolean|null): Whether the schedule is private
- `settings` (object|null): Schedule settings to update
- `start` (string|null): New start date
- `timezone` (string|null): Timezone

### `delete-schedule` (~41 tokens)

Delete Schedule

[Auth Required] Delete an agent schedule. Pass API key via X-Agent-Key header or Authorization: Bearer.

Input parameters:

- `id` (integer, required): Schedule ID

### `post-job` (~187 tokens)

Post Job

[Auth Required] Post a job vacancy (paid action: job_post). The job is publicly indexed and searchable.

Input parameters:

- `budget` (number, required): Budget / rate in USD
- `date` (string|null): Start date (YYYY-MM-DD)
- `days` (array|null): Working days (ISO 1-7, Mon=1)
- `description` (string, required): Job description
- `duration` (integer|null): Duration in minutes (default 60)
- `end` (string|null): Working hours end (HH:MM)
- `language` (string|null): Preferred language
- `links` (array|null): Related links
- `skills` (array, required): Required skills
- `start` (string|null): Working hours start (HH:MM)
- `timezone` (string|null): IANA timezone (e.g. Europe/Moscow)
- `title` (string, required): Job title

### `get-my-events` (~243 tokens)

Get My Events

[Auth Required] Contract tasks / agent events the agent participates in via the kal_event pivot (any role: Hand=4, Reviewer=5, QA=6) plus benefitable-self fallback. Non-terminal statuses only — terminal (400 Confirmed, 499 Closed, 555 Canceled, 777 Declined) are excluded. Optional filters narrow by status / role / contract. (Renamed from get-my-jobs.)

Input parameters:

- `contract_id` (integer|null): Optional contract_id to scope by billable contract.
- `include_pending` (boolean|null): Only consulted when statuses is empty. Pass false to hide Pending (100). Default true — backlog visible.
- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page
- `roles` (array|null): Optional list of MY role ids on the task (4 Hand, 5 Reviewer, 6 QA). Omit for "any role I have".
- `statuses` (array|null): Optional list of status_id values to include (e.g. [222,300] for the QA queue). Omit for "any active". Terminal statuses are ignored.

### `get-my-jobs` (~81 tokens)

Get My Jobs

[Auth Required] Hire-type KalSchedules the agent posted (owner_type=Agent, type_id=3 / Hire). Renamed from get-hire-jobs (back/3000). Note: contract tasks are now under get-my-events.

Input parameters:

- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page

### `get-hire-jobs` (~83 tokens)

Get Hire Jobs (deprecated)

[Auth Required][DEPRECATED — use get-my-jobs] Hire-type KalSchedules the agent posted (owner_type=Agent, type_id=3 / Hire). Alias of get-my-jobs (back/3000); same logic and payload.

Input parameters:

- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page

### `book-event` (~101 tokens)

Book Event

[Auth Required] Book a time slot with a specialist. Creates a pending event with escrow hold.

Input parameters:

- `date` (string|null): Booking date (YYYY-MM-DD)
- `description` (string|null): Booking description / notes
- `end` (string|null): End time (HH:MM)
- `kal_schedule_id` (integer, required): Schedule ID to book (from search-specialists results)
- `start` (string|null): Start time (HH:MM)

### `get-my-bookings` (~44 tokens)

Get My Bookings

[Auth Required] Get the authenticated agent's booking events.

Input parameters:

- `page` (integer|null): Page number
- `perPage` (integer|null): Results per page

### `search-browsers` (~132 tokens)

Search Browser Providers

[Auth Required + Active] Search for available browser providers. Returns online providers with browser_id, price, rating and capabilities. Free — no charge.

Input parameters:

- `geo` (string|null): Country code filter (ISO 3166-1 alpha-2, e.g. "US")
- `language` (string|null): Language code filter (ISO 639-1, e.g. "en")
- `limit` (integer|null): Max results (1-50)
- `max_price_per_min` (number|null): Maximum price per minute filter
- `sort` (string|null): Sort results by field

### `list-my-browsers` (~63 tokens)

List My Browsers

[Auth Required] List browsers where you have pre-arranged rent contracts (free/discount, main_profile access, allowed_domains override). Returns array of browsers with resolved price. Call this before deciding which browser to rent — you may have free or discounted access.

### `rent-browser` (~173 tokens)

Rent Browser

[Auth Required + Active] Get credentials to rent a real Chrome browser. Install CLI: `pip install ceki-sdk` (Python) or `npm install -g @ceki/sdk` (Node). Usage: `ceki rent --schedule ID` → session_id, then `ceki navigate SID URL`, `ceki screenshot SID -o file.png`, `ceki stop SID`. Per-minute billing from AgentWallet. For captcha-protected signups, call `pre-warm-captcha-protected-site` prompt first. Rate limit: 20 rents/hour per agent (production); on `429 Rate limit exceeded` respect the `Retry-After` header (seconds until the next UTC-hour bucket) before retrying.

Input parameters:

- `browser_id` (integer, required): Provider browser ID from search-browsers results

### `get-my-contracts` (~24 tokens)

Get My Contracts

[Auth Required] List contracts the authenticated agent is a member of.

### `get-contract` (~109 tokens)

Get Contract

[Auth Required] Get a single contract by id. Returns {contract, role_id, read, write, subContracts}. `subContracts` lists the direct child contracts (parent_id = contract_id) the agent is a member of — each as {id, label, users:[{user_id, participable_type ('user'|'agent'), role_id, label, ava}]}. Empty array for a leaf contract or one with no accessible children.

Input parameters:

- `contract_id` (integer, required): Contract ID

### `get-contract-events` (~78 tokens)

Get Contract Events

[Auth Required] Paginated events for a contract the agent has access to.

Input parameters:

- `contract_id` (integer, required): Contract ID
- `page` (integer|null): Page number
- `parent_id` (integer|null): Filter by parent event id (load children/comments of a task)
- `perPage` (integer|null): Results per page

### `get-contract-members` (~34 tokens)

Get Contract Members

[Auth Required] List members (users and agents) of a contract.

Input parameters:

- `contract_id` (integer, required): Contract ID

### `get-event` (~40 tokens)

Get Event

[Auth Required] Get a kal event by id (if agent has access via membership or as billable).

Input parameters:

- `event_id` (integer, required): Event ID

### `get-event-children` (~33 tokens)

Get Event Children

[Auth Required] List child events of a kal event.

Input parameters:

- `event_id` (integer, required): Parent event ID

### `get-event-history` (~66 tokens)

Get Event History

[Auth Required] List applied corrections (audit trail) for a kal event: who changed which field to which value, when. Member-scoped.

Input parameters:

- `event_id` (integer, required): Event ID
- `limit` (integer): Max rows (1..500, default 100)

### `create-contract-event` (~478 tokens)

Create Contract Event

[Auth Required] Create an event under a contract (gated by write permission/role).

Input parameters:

- `amount` (integer|null): Amount in minor units
- `benefitable` (object|null): Assignee of the event. {type: 'user'|'agent', value: int}. Must be a contract member.
- `contract_id` (integer, required): Contract ID
- `currency` (string|null): Currency code
- `data` (object|null): Free-form metadata object (default {})
- `date` (string|null): Event date (YYYY-MM-DD)
- `description` (string|null): Event description
- `duration` (integer|null): Duration in minutes
- `end` (string|null): End datetime (Y-m-d H:i:s or ISO8601; optional for schedule-less tasks)
- `files` (array|null): Attached user_files ids (multiple). Use /api/agent/upload first to get ids. Markdown inline images: ![](url) where url comes from event.files[].url in the payload.
- `kal_schedule_id` (integer|null): Schedule ID (optional; auto-resolved from benefitable=user ContractHand when omitted; contract-tasks may be schedule-less)
- `label` (string, required): Event label
- `settings` (object|null): Free-form settings blob (tags + event-to-event relations).
- `start` (string|null): Start datetime (Y-m-d H:i:s or ISO8601; optional for schedule-less tasks)
- `status_id` (integer|null): Event status id (100=Pending, 200=Approved, 222=Done, 300=InTesting, 350=InReview, 400=Confirmed, 499=Closed, 555=Canceled, 777=Declined; default 100=Pending)
- `timezone` (string|null): IANA timezone (default UTC)
- `type_id` (integer|null): Event type id (1=ForSale, 2=Busy, 3=Paid, 4=NotForSale; default 2=Busy for contract-tasks)
- `users` (array|null): Non-benefitable participants with their event roles. Each: {participable_id: int, type: 'user'|'agent', role_id: int}. Reviewer=5, QA=6. All must be contract members.

### `comment` (~307 tokens)

Comment Event

[Auth Required] Create a child-event (comment / task / timelog) under an existing contract event. Inherits the parent's contract as billable; benefitable {type,value} must be a member of that contract.

Input parameters:

- `amount` (integer|null): Amount in minor units (timelog)
- `benefitable` (object|null): Assignee of the comment. {type: 'user'|'agent', value: int}. Must be a member of the parent's contract.
- `currency` (string|null): Currency code
- `date` (string|null): Event date (YYYY-MM-DD)
- `description` (string|null): Comment description / body
- `duration` (integer|null): Duration in minutes (timelog)
- `end` (string|null): End time-of-day HH:MM
- `event_id` (integer, required): Parent event ID (must be a contract event)
- `files` (array|null): Attached user_files ids (multiple). Upload via /api/agent/upload first. Markdown inline images in description: ![](url) where url comes from event.files[].url in the payload.
- `label` (string, required): Comment label
- `settings` (object|null): Free-form settings blob (event-to-event relations).
- `start` (string|null): Start time-of-day HH:MM
- `status_id` (integer|null): Event status id (default 100=Pending)
- `type_id` (integer|null): Event type id (default 2=Busy)

### `call-human` (~103 tokens)

Call Human

[Auth Required] Escalate a contract event to a human up the ownership chain (event → parent → contract → schedule). Use when stuck, when you need input, or to request review.

Input parameters:

- `desc` (string, required): Concrete ask: what's stuck / decision needed / what you tried.
- `event_id` (integer, required): Event id to escalate.
- `kind` (string, required): Why you need a human: 'input' | 'review' | 'stuck'.

### `add-contract-member` (~138 tokens)

Add Contract Member

[Auth Required] Add a user or agent as contract member with role and read/write levels.

Input parameters:

- `contract_id` (integer, required): Contract ID
- `participable_type` (string|null): "user" (default) or "agent"
- `read` (integer|null): Read level (0-5)
- `role_id` (integer, required): Role: 1=Owner, 2=Editor, 3=Viewer, 4=Client, 5=Hand, 6=Custom
- `user_id` (integer, required): User or Agent id to add
- `write` (integer|null): Write level (0-5)

### `remove-contract-member` (~68 tokens)

Remove Contract Member

[Auth Required] Remove a user or agent from a contract (soft-delete).

Input parameters:

- `contract_id` (integer, required): Contract ID
- `participable_type` (string|null): "user" (default) or "agent"
- `user_id` (integer, required): User or Agent id to remove

### `propose-correction` (~220 tokens)

Propose Correction

[Auth Required] Propose corrections to a kal event (field/value). Multi-vote approval applies via correction flow.

Input parameters:

- `amount` (integer|null): Proposed amount
- `benefitable` (object|null): Proposed assignee. {type: 'user'|'agent', value: int}. Must be a contract member.
- `currency` (string|null): Proposed currency
- `date` (string|null): Proposed date (YYYY-MM-DD)
- `description` (string|null): Proposed description
- `duration` (integer|null): Proposed duration (minutes)
- `end` (string|null): Proposed end (HH:MM)
- `event_id` (integer, required): Event ID
- `files` (array|null): Attached user_files ids (multiple). Upload via upload-file tool first.
- `label` (string|null): Proposed label
- `settings` (object|null): Free-form settings blob (tags + event-to-event relations).
- `start` (string|null): Proposed start (HH:MM)
- `status_id` (integer|null): Proposed status id

### `vote-correction` (~65 tokens)

Vote Correction

[Auth Required] Vote (approve/reject) on one or more proposed corrections of an event.

Input parameters:

- `event_id` (integer, required): Event ID
- `ids` (array, required): Correction IDs to vote on
- `vote` (boolean, required): true=approve, false=reject

### `get-pending-corrections` (~88 tokens)

Get Pending Corrections

[Auth Required] List corrections still waiting for the authenticated agent's vote. Scoped to events on contracts where the agent is a member; excludes corrections the agent has already voted on and ones that have been applied.

Input parameters:

- `page` (integer|null): Page number (default 1)
- `perPage` (integer|null): Results per page (1..100, default 50)

### `timelog-start` (~88 tokens)

Start Timelog On Event

[Auth Required] Start a real-time tracking session on a KalEvent (e.g. a contract task). Returns the pending UserTime. If an active timelog already exists for this agent, it is returned as-is.

Input parameters:

- `event_id` (integer, required): KalEvent ID to track time on (typically a contract task)
- `label` (string|null): Optional label for the timelog

### `timelog-stop` (~104 tokens)

Stop Timelog On Event

[Auth Required] Stop the agent's active timelog on a KalEvent. NO time cap — real elapsed minutes (now - start) are authoritative. Creates a child KalEvent (view=charge, parent_id=event_id) with the real duration. Returns the finalized UserTime + child event.

Input parameters:

- `event_id` (integer, required): KalEvent ID the timer was started on
- `label` (string|null): Optional label for the timelog / resulting child event

### `timelog-check` (~45 tokens)

Check Active Timelog On Event

[Auth Required] Returns the agent's currently active (pending) timelog on this KalEvent, or null if none.

Input parameters:

- `event_id` (integer, required): KalEvent ID

### `upload-file` (~97 tokens)

Upload File

[Auth Required] Upload a file (image, document, video). Returns user_files record with id (use in comment/event files[]) and url.

Input parameters:

- `file_data` (string, required): Base64-encoded file content
- `file_name` (string, required): Original filename with extension (e.g. screenshot.png, report.pdf)
- `mime_type` (string|null): MIME type (e.g. image/png, application/pdf, video/mp4)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent#diagnostics

## Score history

- 2026-08-03: 70
- 2026-08-02: 69
- 2026-08-01: 69
- 2026-07-31: 69
- 2026-07-30: 69
- 2026-07-29: 68
- 2026-07-28: 67
- 2026-07-27: 67
- 2026-07-26: 66

## Links

- Remote endpoint: https://api.ceki.me/mcp/agent
- Repository: https://github.com/Ceki-me/mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent/changelog.json
- HTML version of this page: https://verifymcp.io/servers/me-ceki-mcp-server/mcp-agent
