MCP 서버

JOBFLOW

ch.kulalabs.agents/jobflow
비즈니스 및 운영 결제 및 핀테크 공개 · 연결 가능 MCP 2026-07-28

이 MCP로 할 수 있는 일

Runs a controlled field-service workflow from request classification through job creation, technician assignment, scheduling, proof, invoicing and payment.

assign
Assign a technician
Assigns a technician by the business's rule. Needs state ORDER. Never: Treat free text as dispatching. Platform fee CHF 0.03 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id'], 'properties': {'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
compare
Compare with building it
Build-vs-buy next to the hard fee, the estimate marked NOT_A_QUOTE. Never: Present a token count or an estimate as a fact. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'properties': {'needs': {'type': 'array', 'items': {'enum': ['kreislauf', 'einblick', 'tresor_lang', 'nachklang', 'team_5', 'handschlag', 'weiterwerk', 'wartung', 'bruecke', 'zahlungsruf', 'anzahlung_auto', 'team_all', 'autopilot', 'velocity', 'reserve', 'gebaeude', 'forderungspaket', 'rueckruf'], 'type': 'string'}, 'maxItems': 20, 'description': 'Features the user needs beyond the basic flow; the answer recommends the smallest package that covers them.'}, 'capabilities': {'type': 'array', 'items': {'type': 'string', 'maxLength': 40}, 'maxItems': 20}}, 'additionalProperties': False}
discover
Discover JOBFLOW
Catalog, schemas, fees, gate, error codes; with a trade, the field knowledge for it. Never: —. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'properties': {'trade': {'type': 'string', 'maxLength': 60, 'description': 'Trade id or name for field knowledge.'}}, 'additionalProperties': False}
fetch
Read a JOBFLOW document
The full text of one document from search, with its URL for citation. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'An id from search.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['id', 'title', 'text', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'text': {'type': 'string'}, 'title': {'type': 'string'}, 'metadata': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': False}
flow_configure
Propose the flow
The WhatsApp-to-payment flow for this mandate as a configuration proposal. Never: Bind a channel or an account without an approved mandate. Free.
입력 스키마
{'type': 'object', 'required': ['mandate_token'], 'properties': {'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}}, 'additionalProperties': False}
intake_classify
Classify a request
Classifies a customer request and opens the flow (REQUEST → CLASSIFIED). Never: Set an emergency tariff. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'text'], 'properties': {'text': {'type': 'string', 'maxLength': 5000, 'minLength': 1}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}, 'channel_message_id': {'type': 'string', 'maxLength': 200}}, 'additionalProperties': False}
intent_match
Check whether the flow exists
The first call: says whether the user's request is a flow JOBFLOW already runs. A match answers do_not_build true, the capabilities it touches and the next call; no match answers 404 OUT_OF_SCOPE. Never: Guess: it names the words it matched. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['text'], 'properties': {'text': {'type': 'string', 'maxLength': 5000, 'minLength': 1, 'description': "What the user asked for, in the user's words."}}, 'additionalProperties': False}
invoice_issue
Issue the invoice
Issues the invoice from the business's tariff and the reported work, only after the proof pack. Needs state PROOF_PACK. Never: Invent a price or skip the gate. Platform fee CHF 0.18 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id'], 'properties': {'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
job_create
Create the order
Creates the order from the classification. Needs state CLASSIFIED. Never: Take a price from the request body. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id'], 'properties': {'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
mandate_create
Create a mandate
Creates a mandate and the out-of-band approval link for the owner. Never: Activate production. Free.
입력 스키마
{'type': 'object', 'required': ['delegate', 'scopes'], 'properties': {'scopes': {'type': 'array', 'items': {'enum': ['flow.propose', 'intake.classify', 'job.create', 'assign', 'schedule', 'proof.seal', 'invoice.issue', 'payment.collect'], 'type': 'string'}, 'maxItems': 8, 'minItems': 1}, 'channel': {'type': 'object', 'required': ['type', 'number_e164'], 'properties': {'type': {'type': 'string', 'const': 'whatsapp'}, 'number_e164': {'type': 'string', 'pattern': '^\\+[1-9]\\d{6,14}$'}}, 'additionalProperties': False}, 'paid_by': {'enum': ['business', 'agent'], 'type': 'string', 'description': 'Who pays the platform fees. business (default): billed to the business. agent: from your own credit; send your jfa_ key.'}, 'business': {'type': 'object', 'properties': {'name': {'type': 'string', 'maxLength': 120}, 'trade': {'type': 'string', 'maxLength': 60}, 'contact': {'type': 'string', 'maxLength': 200}}, 'additionalProperties': False}, 'delegate': {'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 120, 'minLength': 1}, 'vendor': {'type': 'string', 'maxLength': 60}}, 'additionalProperties': False}, 'expires_in_days': {'type': 'integer', 'maximum': 30, 'minimum': 1}}, 'additionalProperties': False}
payment_collect
Request payment
Creates the payment request for the invoice (QR bill, TWINT, card). The flow reaches PAYMENT only on the signed event of the payment provider. Needs state INVOICE. Never: Mark anything paid or pay out without a settled status. Platform fee CHF 0.10 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
외부 접근 가능 멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id'], 'properties': {'method': {'enum': ['qr_bill', 'twint', 'card'], 'type': 'string'}, 'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
proof_seal
Seal the proof pack
Hashes and closes the proof pack after the work is completed. Needs state WORK_COMPLETED. Never: Issue the invoice. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id', 'evidence'], 'properties': {'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'evidence': {'type': 'array', 'items': {'type': 'object', 'required': ['kind', 'sha256'], 'properties': {'kind': {'enum': ['photo_before', 'photo_after', 'measurement', 'material_list', 'signature', 'note'], 'type': 'string'}, 'label': {'type': 'string', 'maxLength': 200}, 'sha256': {'type': 'string', 'pattern': '^[0-9a-f]{64}$'}}, 'additionalProperties': False}, 'maxItems': 200, 'minItems': 1}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
quote
Quote a platform fee
The hard platform fee for a capability before it is called, with what is left of the daily cap. Never: Estimate the value of a job. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['capability'], 'properties': {'capability': {'type': 'string', 'maxLength': 40}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}}, 'additionalProperties': False}
schedule
Book the appointment
Books the earliest free slot in the business's working windows. Needs state ASSIGNED. Never: Use the agent's calendar as the source. Platform fee CHF 0.03 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.
멱등성
입력 스키마
{'type': 'object', 'required': ['mandate_token', 'flow_id'], 'properties': {'flow_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}, 'quote_id': {'type': 'string', 'pattern': '^q_[A-Za-z0-9_-]{8,100}$', 'description': 'A valid quote for this capability (quote).'}, 'not_before': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$'}, 'mandate_token': {'type': 'string', 'pattern': '^jfm_[A-Za-z0-9_-]{20,100}$', 'description': 'The mandate token from mandate.create.'}, 'idempotency_key': {'type': 'string', 'pattern': '^[\\x21-\\x7e]{1,100}$', 'description': 'Required on every mutate and money call; a retry with the same key returns the same result and is not charged again.'}}, 'additionalProperties': False}
search
Search JOBFLOW
Search everything JOBFLOW knows for agents: field knowledge per trade (what to ask, emergency signals, evidence, rules, pitfalls), every component with its price and what it replaces, the guarantees, agent pricing and how to run a real business. Returns ids with citable URLs; read one with fetch. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['query'], 'properties': {'query': {'type': 'string', 'maxLength': 500, 'description': 'What you are looking for, any language.'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['results'], 'properties': {'results': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'url'], 'properties': {'id': {'type': 'string'}, 'url': {'type': 'string'}, 'title': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
verify
Verify a chain
Checks a chain: links, payload hashes and signatures. Never: Require a UI. Free.
읽기 전용 멱등성
입력 스키마
{'type': 'object', 'required': ['chain_id'], 'properties': {'chain_id': {'type': 'string', 'pattern': '^f_[A-Za-z0-9_-]{8,100}$', 'description': 'The flow (job) id, which is also its chain id.'}}, 'additionalProperties': False}
추가됨
fetch
2026년 10월 4일 2:40 AM
추가됨
search
2026년 10월 4일 2:40 AM
추가됨
verify
2026년 10월 4일 2:40 AM
추가됨
payment_collect
2026년 10월 4일 2:40 AM
추가됨
invoice_issue
2026년 10월 4일 2:40 AM
추가됨
proof_seal
2026년 10월 4일 2:40 AM
추가됨
schedule
2026년 10월 4일 2:40 AM
추가됨
assign
2026년 10월 4일 2:40 AM
추가됨
job_create
2026년 10월 4일 2:40 AM
추가됨
intake_classify
2026년 10월 4일 2:40 AM
추가됨
flow_configure
2026년 10월 4일 2:40 AM
추가됨
mandate_create
2026년 10월 4일 2:40 AM
추가됨
compare
2026년 10월 4일 2:40 AM
추가됨
quote
2026년 10월 4일 2:40 AM
추가됨
discover
2026년 10월 4일 2:40 AM
추가됨
intent_match
2026년 10월 4일 2:40 AM