{"protocolVersion":"0.3.0","name":"HALOWERK buerowerk","description":"HALOWERK buerowerk. Bezahlung über x402 in USDC auf Base Mainnet.","url":"https://buero.halowerk.com","version":"1.0.0","preferredTransport":"JSONRPC","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"skills":[{"id":"entity_graph","name":"Extracts the entities, the relations between them and the dates from a supplied text, and returns every single relation with the verbatim sentence it was drawn from, checked against the source before it goes out.","description":"Takes a text as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns it as a graph: the people, organisations, places, products, documents and events it names, and the relations it states between them. Every relation carries the sentence it came from word for word, plus the character offset and line where that sentence stands, and each of those quotes is looked up in the source text before the answer goes out: an exact match, or a match after whitespace is normalised. A relation whose quote cannot be located is returned flagged as unverified and counted separately rather than passed off as a finding, and a relation pointing at an entity the extraction never named is discarded outright, because a model that invents an edge is worse than one that finds nothing — the buyer cannot tell. Dates are handled the same way: the wording is returned verbatim from the text and verified like any other quote, while the ISO form beside it is labelled as a conversion, not as a finding. Entities carry a deterministic identifier derived from their name, so two answers about the same text can be laid against each other. What this endpoint does not do is know anything: it adds no world knowledge, resolves no company against a register, merges no two same-named parties into one, and draws no conclusion the text does not state — what is not in the text is not in the graph. It also does not judge whether a relation is usual, favourable or lawful. The text is processed by a third-party model — the provider, what leaves this machine and what is retained there are named in every answer. Nothing is cached, nothing is written to a database, and no part of the text appears in any log or error message.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"processing_record","name":"Turns a structured inventory of processing activities into a draft record under Article 30(1) GDPR, listing each activity against the lettered items the article requires and naming exactly which of them the submitted inventory does not cover.","description":"Takes an inventory — the controller, and one entry per processing activity with its purposes, the stated legal basis, the categories of data subjects and of personal data, the categories of recipients, any third-country transfers, the erasure periods and the security measures — and returns it laid out as a draft record of processing activities under Article 30(1) GDPR. Every activity comes back mapped item by item onto letters (a) through (g) of that article, each letter marked present or missing, with a per-activity and an overall completeness count, so what the inventory does not yet cover is named rather than quietly rendered as a finished form. Legal bases are accepted only as the enumerated values of Article 6(1) and Article 9(2), and special-category data is flagged as requiring an Article 9(2) basis in addition, but which basis applies is the caller statement and is passed through, never chosen here. Third-country transfers are checked against the EEA member list and, where a destination lies outside it, the safeguard the caller has declared under Article 46 or 49 is carried into the record, or its absence is reported as a gap under letter (e). Two limits are deliberate and hard. The input is an inventory, not raw data: anything that looks like an IP address, and free-text addresses outside the contact blocks, are refused with HTTP 400 naming the field and the pattern but never echoing the value, because a record describes categories and does not carry a single data subject. And the output is a form draft, not legal advice: it does not decide whether a legal basis holds, whether a retention period is appropriate, whether a transfer is permitted or whether the processing is lawful at all, it performs no balancing test under Article 6(1)(f), and it does not assess whether a data protection impact assessment is required. Those decisions stay with the controller. No model is involved, no external source is contacted and nothing is stored: the same input yields byte-identical output.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"doc_merge","name":"Merges two versions of a document against their common base, by paragraph or by line, and where both sides changed the same passage it names the conflict with all three readings instead of silently picking one.","description":"Takes three documents — the common base and the two versions derived from it — as text, public URLs or inline base64, reads PDF, DOCX, ODT, HTML and Markdown, and returns one merged document. The procedure is diff3 over paragraphs, or over lines if you ask for that: each version is first compared against the base with a Myers shortest-edit-script, the two comparisons together yield the passages that are identical in all three, and each region between them is resolved by rule. A region only one side touched is taken from that side; a region both sides changed to exactly the same text is taken once; and a region both sides changed differently is a conflict. Conflicts are never resolved. Each one comes back with the base wording, both competing versions, a word-level diff of each side against the base, and its position counted in units, and in the merged text it is marked with labelled markers, or the base wording is kept, or the merged text is withheld entirely — your choice, and whichever you pick the conflict is still reported and counted. The counts of merged, conflicting and unchanged paragraphs come alongside, plus a symmetric similarity figure for each version against the base and against the other version, and a flag saying whether the comparison really was the shortest edit script or hit its complexity ceiling, in which case the affected region is reported as a conflict rather than guessed at. What this endpoint does not do is decide. It does not judge which version is better, newer or more authoritative, does not know who wrote either, does not merge inside whichever unit you chose, and does not check that the merged document still makes sense as a whole — a merge that is clean by paragraph can still be contradictory in substance, and only a reader can see that. No model is involved and no external source is contacted: the same three inputs give byte-identical output, and no part of any document is written to a database, a cache, a log or an error message.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"meeting_actions","name":"Turns a meeting transcript into action items with owner and due date, the decisions that were taken and the questions left open — each one carrying the verbatim line it came from, checked against the transcript.","description":"Takes a transcript as text, a public URL or inline base64 and returns what follows from the meeting: the tasks, who is responsible, by when, the decisions that were actually taken, and the questions that stayed open. Every single entry carries the verbatim passage it was drawn from, and that passage is looked up in the transcript before the answer goes out — an exact match or a match after whitespace is normalised. Anything that cannot be located is returned flagged as unverified and counted separately, because an invented task in a set of minutes is only noticed once somebody has failed to do it. Where the transcript does not name a responsible person, the field stays empty instead of being filled with the nearest name. Relative deadlines are only turned into dates when a reference_date is supplied, and then only for unambiguous phrases such as today, tomorrow, end of the month or a named weekday, with the rule that was applied returned alongside; everything else keeps the wording as it fell and is marked unresolved. The transcript is processed by a third-party model, and the provider, what leaves this machine and what is retained there are named in every answer — a caller under a confidentiality obligation or a works agreement has to make that call themselves. Nothing is cached, nothing is written to a database, and no part of the transcript appears in any log or error message.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"availability_resolve","name":"Takes anonymous busy blocks from several people, each with their own timezone and working hours, and returns the common free windows long enough for the meeting, ranked, with who can attend each one and who cannot.","description":"Give it a search window, a meeting length, and for each participant a list of busy blocks — start and end, nothing else — and it returns the windows in which the meeting fits. Each participant carries their own IANA timezone and working hours, so nine-to-five means nine-to-five where they are, across daylight saving changes, and a meeting is only offered when it lies entirely inside one working-hours block for everyone counted as present. Windows are returned with the participants who can attend, those who cannot, and a rank that puts full attendance first and the earliest slot next; setting min_attendees or marking participants as optional produces partial windows too, each labelled with exactly who is missing. Alongside the windows every participant gets a load figure — busy minutes, free minutes inside working hours, and a percentage — and all of them are measured over the identical search window, because a percentage from a two-week sample set beside one from three weeks compares nothing. The input is deliberately impoverished: it takes no calendar credentials, no event titles, no attendee names, no location, and an identifier may be a single letter. Nothing is stored beyond the response. What it does not do is decide: it will not rank by anyone seniority, guess which meeting may be moved, or read a busy block as tentative — a block is busy, and a slot that fits is offered without any claim that it is a good time.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"clause_extract","name":"Finds the termination, liability, term, payment and jurisdiction clauses in a contract and returns each one verbatim with its position in the text. It extracts and locates; it does not assess whether a clause is valid, usual or favourable.","description":"Takes a contract as text, a public URL or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and returns the passages governing the requested topics. Termination, liability, term, payment and jurisdiction are the default; confidentiality, data protection, IP, warranty, force majeure, assignment and notice can be requested as well. Every finding comes back with the clause quoted word for word, the character offset and line where it stands, the section heading if the document names one, and a plain description of what is regulated. Each quote is then checked against the source text before it is returned: an exact match, or a match after whitespace is normalised, and anything that cannot be located is returned flagged as unverified and counted separately rather than passed off as a finding — a model that invents a clause is worse than one that finds nothing, because the buyer cannot tell. What this endpoint deliberately does not do is judge. It gives no opinion on whether a clause is effective, enforceable, unusual, risky or disadvantageous, makes no recommendation and offers no assessment of the legal position; that would be legal advice, which it is not permitted to give. The text is processed by a third-party model — the provider, what leaves this machine and what is retained there are named in every answer, because a caller bound by confidentiality has to decide that for themselves. Nothing is cached, nothing is written to a database, and no part of the contract appears in any log or error message.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"terms_diff","name":"Compares two versions of a contract: a shortest-edit-script diff decides which passages changed, and a model then describes what changed in substance at exactly those passages — so no change can be invented and none silently dropped.","description":"Takes two contract versions as text, public URLs or inline base64 — PDF, DOCX, ODT, HTML and Markdown are read — and reports what is different. Which passages changed is decided by a Myers shortest-edit-script over the paragraphs, not by a model: the deterministic comparison is the source of truth, and only afterwards is a model asked what changed in substance at those specific places. That order is the point. A model handed two whole contracts returns a plausible list of changes whose completeness nobody can check, which on a contract is the most expensive mistake available; here every statement is anchored to a paragraph pair that both versions evidence, and any passage the model fails to describe is still returned with its before and after text, because the diff decides, not the model. Each change carries its old and new wording, a word-level diff of exactly which words went and came, a factual type — value changed, deadline changed, obligation added or removed, party, scope, reference, or wording only — and the concrete old and new values where there are any. Alongside comes a symmetric similarity figure and the counts of added, removed and reworded paragraphs. What this endpoint does not do is judge: it says what is different, never whether a change is favourable, material or enforceable, and it is not legal advice. The changed passages are processed by a third-party model — provider, what leaves this machine and what is retained there are named in every answer. Nothing is cached, nothing is written to a database, and no part of either contract appears in any log or error message.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"persona_eval","name":"Evaluate product copy or a product concept from one explicitly supplied target-persona perspective, returning reactions, objections, triggers and concrete revisions.","description":"Runs a structured synthetic-persona critique through Groq using the configured model. The persona is treated as a hypothesis, never as a factual claim about every member of a demographic group; the response must state its assumptions and avoid sensitive-trait stereotyping. Input leaves this server for Groq and is not stored by HALOWERK. This is qualitative simulation, not user research, survey evidence or proof of conversion impact.","tags":["buerowerk"],"examples":[],"inputModes":["application/json"],"outputModes":["application/json"]}],"payment":{"protocol":"x402","network":"eip155:8453","asset":"USDC","recipient":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","manifest":"https://buero.halowerk.com/.well-known/x402"}}