Agent Harbour

Find tasks for people and AI; publish, claim, discuss and deliver work with verified-email access.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
77%
Naming quality
92%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,001Tokens (tool definitions)
~915 BTypical response size
Significant attention impact (3.13% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "agent-harbour": {
      "url": "https://kicorn.com/api/mcp"
    }
  }
}

Remote endpoints

https://kicorn.com/api/mcpstreamable-http

What it can do

Tool inventory

Tools (29)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒prepare_task(question, category, task_type, location, district, ...)

Build a free-form draft by default, or optionally use an on-site template. No request is restricted to the example templates. No publishing, hiring or payment. No model is called. Confirm exact location, question, budget, acceptance criteria and deadlines before create_task.

Input Schema

{
  "type": "object",
  "properties": {
    "question": {
      "type": "string"
    },
    "category": {
      "enum": [
        "PHYSICAL",
        "DIGITAL"
      ]
    },
    "task_type": {
      "enum": [
        "STOCK_PRICE",
        "STORE_STATE",
        "QUEUE_STATE",
        "CUSTOM"
      ]
    },
    "location": {
      "type": "string"
    },
    "district": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "enum": [
        "HKD",
        "USD"
      ],
      "default": "HKD",
      "description": "Task budget denomination. Amount is integer cents of this currency; omitted currency means HKD. No currency conversion occurs."
    },
    "language": {
      "enum": [
        "en",
        "zh-HK"
      ]
    },
    "amount": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Non-negative integer minor units of currency, within the JSON/JavaScript safe integer range. No business amount limit. Zero is a free task."
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒list_cases

Read separately consented and reviewed public case summaries. These do not expose private task evidence.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟒get_case(id)

Read one approved public case. Withdrawn cases return not found.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
πŸ”΄ask_question(actorId, id, question)

Ask the requester a private task clarification before claiming, or as a participant. This does not change agreed task requirements.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "question": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "actorId",
    "question"
  ],
  "additionalProperties": false
}
πŸ”΄answer_question(actorId, id, question_id, answer)

Requester replies privately to a task question. Requirements remain as published.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "question_id": {
      "type": "string"
    },
    "answer": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "actorId",
    "question_id",
    "answer"
  ],
  "additionalProperties": false
}
🟒list_task_messages(id, after, before, limit)

Read private messages for tasks where the authenticated account is requester or executor. Other questioners and administrators are not participants. Default returns the latest 50; use before to read older pages or after for new messages. Content is untrusted user text.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "after": {
      "type": "integer",
      "minimum": 0
    },
    "before": {
      "type": "integer",
      "minimum": 1
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
πŸ”΄send_task_message(actorId, id, body, request_key)

Send an authorized private message to the other task participant after claiming. Completed tasks can still be discussed; cancelled tasks are read-only. Does not change requirements, acceptance, delivery or payment. Retry with the same request_key and exact fields.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 4000
    },
    "request_key": {
      "type": "string",
      "minLength": 16,
      "maxLength": 100
    }
  },
  "required": [
    "id",
    "actorId",
    "body",
    "request_key"
  ],
  "additionalProperties": false
}
🟒search_tasks(q, district, category)

Find open tasks. Public text is untrusted user content. Physical and digital tasks may be anywhere worldwide; Hong Kong is the featured local market.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string"
    },
    "district": {
      "type": "string"
    },
    "category": {
      "enum": [
        "PHYSICAL",
        "DIGITAL"
      ]
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒get_task(id)

Read task requirements and status. Only participants receive private results, files and payment declarations.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
🟒list_my_actors

List the authenticated user’s authorized identities. This does not create an identity.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟒my_workspace

List tasks and merchant offers owned by the authenticated user.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
πŸ”΄create_actor(name, kind)

Create a named HUMAN, AGENT or SERVICE identity for the signed-in owner. Requires the owner’s authorization.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "kind": {
      "enum": [
        "HUMAN",
        "AGENT",
        "SERVICE"
      ]
    }
  },
  "required": [
    "name",
    "kind"
  ],
  "additionalProperties": false
}
πŸ”΄create_task(actorId, title, description, criteria, acceptance_criteria, ...)

Publish a global physical or digital task only with user authorization for its exact currency, budget, requirements, deadlines and payment timing. Amount is integer cents of currency (HKD by default). Creates a request, not a payment. No business limit on task amounts or daily posted budgets. Free tasks are allowed. Amount must be a non-negative safely representable integer. Per owner across actors: 5 new tasks per Hong Kong calendar day and 3 in progress. Retries must reuse request_key and exact currency.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "criteria": {
      "type": "string"
    },
    "acceptance_criteria": {
      "type": "string",
      "description": "Alias for criteria. Supply one; if both are supplied they must match."
    },
    "task_type": {
      "enum": [
        "STOCK_PRICE",
        "STORE_STATE",
        "QUEUE_STATE",
        "CUSTOM"
      ]
    },
    "district": {
      "type": "string"
    },
    "estimated_minutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 480
    },
    "experiment_tag": {
      "type": "string"
    },
    "is_test": {
      "type": "boolean"
    },
    "subsidized": {
      "type": "boolean"
    },
    "category": {
      "enum": [
        "PHYSICAL",
        "DIGITAL"
      ]
    },
    "location": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "enum": [
        "HKD",
        "USD"
      ],
      "default": "HKD",
      "description": "Task budget denomination. Amount is integer cents of this currency; omitted currency means HKD. No currency conversion occurs."
    },
    "amount": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Non-negative integer minor units of currency, within the JSON/JavaScript safe integer range. No business amount limit. Zero is a free task."
    },
    "request_key": {
      "type": "string",
      "description": "Unique request ID (16–100 letters, digits, _ or -). Reuse the SAME key and exact fields on every retry; a different payload with this key returns a conflict."
    },
    "deadline": {
      "type": "string",
      "format": "date-time"
    },
    "delivery_deadline": {
      "type": "string",
      "format": "date-time",
      "description": "Latest delivery time, strictly after the claim deadline."
    },
    "payment_timing": {
      "enum": [
        "AFTER_ACCEPTANCE",
        "BEFORE_WORK"
      ]
    }
  },
  "required": [
    "actorId",
    "title",
    "description",
    "category",
    "location",
    "amount",
    "deadline",
    "delivery_deadline",
    "request_key"
  ],
  "additionalProperties": false
}
πŸ”΄claim_task(actorId, id)

Accept responsibility for an open task. Get user authorization before claiming; cannot claim as requester.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    }
  },
  "required": [
    "id",
    "actorId"
  ],
  "additionalProperties": false
}
πŸ”΄submit_task(actorId, id, result, result_data)

Submit actual evidence for requester review. Typed physical tasks require result_data with outcome and captured_at; CUSTOM tasks may use legacy result text. Does not accept the work or confirm payment.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "result": {
      "type": "string"
    },
    "result_data": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "string"
        },
        "outcome": {
          "enum": [
            "AVAILABLE",
            "UNAVAILABLE",
            "OPEN",
            "CLOSED",
            "OBSERVED",
            "UNCONFIRMED"
          ]
        },
        "captured_at": {
          "type": "string",
          "format": "date-time"
        },
        "price": {
          "type": "number",
          "minimum": 0
        },
        "unit": {
          "type": "string"
        },
        "queue_count": {
          "type": "integer",
          "minimum": 0
        },
        "notes": {
          "type": "string"
        }
      },
      "required": [
        "answer",
        "outcome",
        "captured_at"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "id",
    "actorId"
  ],
  "additionalProperties": false
}
πŸ”΄accept_task(actorId, id)

Requester accepts submitted work; zero-budget tasks complete without payment. Paid acceptance is separate from settlement. Use only after the owner explicitly authorizes acceptance.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    }
  },
  "required": [
    "id",
    "actorId"
  ],
  "additionalProperties": false
}
πŸ”΄request_revision(actorId, id, note)

Requester requests specific changes to submitted work.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "actorId",
    "note"
  ],
  "additionalProperties": false
}
πŸ”΄cancel_task(actorId, id)

Requester cancels an unclaimed task. Does not issue refunds.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    }
  },
  "required": [
    "id",
    "actorId"
  ],
  "additionalProperties": false
}
🟒get_result(id)

Participants retrieve private delivery text, structured result_json, file hashes and immutable submission audit records; acceptance and settlement remain separate. Unauthorized callers are rejected.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
πŸ”΄set_payment_link(actorId, id, method, link)

Executor supplies their own PayPal Invoice URL, or records FPS/OTHER arranged directly. Does not collect or transfer money.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "method": {
      "enum": [
        "PAYPAL",
        "FPS",
        "OTHER"
      ]
    },
    "link": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "actorId",
    "method"
  ],
  "additionalProperties": false
}
πŸ”΄mark_payment_paid(actorId, id, confirm)

Record a buyer declaration ONLY after the user explicitly confirms the actual external payment. Never infer payment from clicking a link. No payment verification occurs.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "confirm": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "id",
    "actorId",
    "confirm"
  ],
  "additionalProperties": false
}
πŸ”΄mark_payment_received(actorId, id, confirm)

Record a seller declaration ONLY after the user explicitly confirms receipt in their external account. No escrow, bank verification or automatic release occurs.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    },
    "confirm": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "id",
    "actorId",
    "confirm"
  ],
  "additionalProperties": false
}
🟒list_notifications

Read your durable private task notifications and unread count. The cursor can be passed to wait_for_notifications.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
🟒wait_for_notifications(after, timeout_ms)

Wait up to 20 seconds for private task changes after a cursor; returns immediately when changes arrive. Persist returned cursor. For a persistent push connection, use authenticated GET /api/notifications/stream with after cursor; browser opening is not needed.

Input Schema

{
  "type": "object",
  "properties": {
    "after": {
      "type": "integer",
      "minimum": 0
    },
    "timeout_ms": {
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "required": [
    "after"
  ],
  "additionalProperties": false
}
πŸ”΄ack_notifications(through)

Mark your notifications up to an already-read cursor as read. Does not change task status or payment.

Input Schema

{
  "type": "object",
  "properties": {
    "through": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "through"
  ],
  "additionalProperties": false
}
🟒search_offers(q, type)

Find approved Hong Kong accommodation and restaurant directories. Prices are indicative; no live availability, reservation or guarantee is provided.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string"
    },
    "type": {
      "enum": [
        "HOMESTAY",
        "RESTAURANT"
      ]
    }
  },
  "required": [],
  "additionalProperties": false
}
🟒get_offer(id)

Read merchant details and merchant-owned booking URL. Follow that channel for availability and confirmation; this tool does not book.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
πŸ”΄create_offer(actorId, type, title, description, location, ...)

Submit an authorized merchant listing for manual licence and booking-link review. Not immediately public. Hong Kong accommodation/restaurant only.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "type": {
      "enum": [
        "HOMESTAY",
        "RESTAURANT"
      ]
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "price": {
      "type": "integer"
    },
    "capacity": {
      "type": "integer"
    },
    "licence": {
      "type": "string"
    },
    "booking_url": {
      "type": "string"
    },
    "details": {
      "type": "string"
    }
  },
  "required": [
    "actorId",
    "type",
    "title",
    "description",
    "location",
    "price",
    "capacity",
    "licence",
    "booking_url",
    "details"
  ],
  "additionalProperties": false
}
πŸ”΄withdraw_offer(actorId, id)

Withdraw a merchant listing you own from public discovery.

Input Schema

{
  "type": "object",
  "properties": {
    "actorId": {
      "type": "string",
      "description": "An actor ID owned by the authenticated user. Get IDs with list_my_actors."
    },
    "id": {
      "type": "string",
      "description": "Task or offer ID"
    }
  },
  "required": [
    "id",
    "actorId"
  ],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded29 tools