{"id":382675,"recorded_at":"2026-10-27T00:05:28.020850Z","observed_at":"2026-10-27T00:05:28.020790Z","subject_kind":"endpoint","subject":"bf3c1070-f0b1-4911-80f7-8f9d6baf2034","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":34,"tools":[{"description":"Says what this account has used and has left of its monthly project allowance, the date it starts again, and, when the limit is reached, how to carry on sooner. A project is identified by the plan's work id and title: the same id and title is one project, and changing either starts a new one. It counts when a tool that makes a finished document (shot list, generation briefs, call sheet, shoot-day pack, edit guide, edit file) first makes one for it that month. Drafting, checking and fixing never count, and a project that already had a finished document made this month stays open all month, up to the fair-use limit. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. Call this before starting a project if you want to know whether a finished document will be available. Input: none. Output: shoot-plan.allowance/1 with projects_used, projects_allowed, projects_left, resets_on and a message. The allowance belongs to the account, not the key, so a new key does not reset it. Needs an agent key from a Shoot Plan account. No AI model runs. This tool never counts toward the allowance. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"name":"shoot_plan_allowance"},{"description":"Applies one fix, taken from a shoot_plan_check result, to a plan and checks the revised plan again. Some fixes trade one thing for another (each says its trade_off): tell your human before applying one that does. Input: plan; finding_id and fix_id (a finding's id, and the id of one of its suggestions, both from shoot_plan_check); and optionally findings, the check result you already have, which saves recomputing it. Output: {plan, findings}, the revised plan and its new findings. Nothing is stored, here or by us: keep the revised plan yourself. A wrong finding_id or fix_id is refused with the ids that exist. No AI model runs. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"finding_id":{"description":"The id of a finding in the shoot_plan_check result, for example f-3a9c51d02b7e.","type":"string"},"findings":{"additionalProperties":true,"description":"Optional: the dpl.findings/1 document shoot_plan_check returned for this same plan, exactly as returned.","type":"object"},"fix_id":{"description":"The id of one of that finding's suggestions, for example fix-1 or restage.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan","finding_id","fix_id"],"type":"object"},"name":"shoot_plan_apply_fix"},{"description":"Makes the call sheet for a shoot from a plan's schedule: for the whole schedule, or for one shoot day, who is called, where and when, with the set-ups in order. A plan with no schedule has no times, and the call sheet says so rather than inventing any. Input: plan, a dpl.plan/1 object that validates; optionally day, the id of one day in the plan's schedule (a day the plan does not have is refused, and the refusal lists the days it has). Output: dpl.call-sheet/1. No AI model runs; we don't keep the plan. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"day":{"description":"Optional: the id of one shoot day in the plan's schedule, for example day1. Leave it out for the whole schedule.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_call_sheet"},{"description":"Return truthful Shoot Plan scope, availability, privacy and commercial state.","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"name":"shoot_plan_capabilities"},{"description":"Checks whether a shot plan will cut together before you film or generate it. It looks for crossed lines of action, mismatched eyelines, missing reactions, speakers who are never on screen, missing geography, jump cuts, travel direction, and props that change with no cause. It returns evidence from the plan and fixes it has already tested. The check is instant, and no AI model runs. It checks editing craft, not whether the film is good. Scenes without staging, dialogue or coverage detail come back \"not assessed\": call shoot_plan_missing_details for the questions to ask your human. Input: plan, a dpl.plan/1 object sent inline (call shoot_plan_format first if you have not written one). Optionally dispositions, the decision log that shoot_plan_record_decision gave you: a finding you decided about earlier, whose evidence has not changed, comes back closed with your reason, and one whose evidence has changed comes back open again (the answer then also says dispositions_applied: how many decisions were applied, reopened or matched no finding). Without dispositions the answer is the same as ever. Output: dpl.findings/1 with stable finding ids, plan_hash, rules_version, any not_assessed scenes and, per finding, its tested fixes (apply one with shoot_plan_apply_fix). A plan that does not validate gets dpl.diagnostics/1 instead: each problem with its path and a fix. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"dispositions":{"additionalProperties":true,"description":"The decision log: the dpl.dispositions/1 document shoot_plan_record_decision returned, exactly as returned. You keep it; we don't.","type":"object"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_check"},{"description":"Answers \"did we get it?\" before the crew leaves a location: from the plan and the take log it says which must-have shots have no good take, which reactions or cutaways the edit will need are still missing, what must match on the next set-up, and whether room tone was recorded. A \"hold\" verdict is not yet a decision, so it does not count as covered and is asked about. The tools take text only, never video or audio, and no AI model runs. Input: plan and takes (a dpl.takes/1 log); optionally location, scene and day to look at one part of the shoot (each a string, comma-separated names allowed, or a list of strings; a name that is not in the plan is refused with a fix), and next_setup, the set-up that follows. Output: dpl.coverage-status/1. We don't keep the plan or the take log. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"day":{"description":"Optional: only these shoot days, as the plan's schedule names them.","items":{"type":"string"},"type":["string","array"]},"location":{"description":"Optional: only these locations (a name, a comma-separated list, or a list).","items":{"type":"string"},"type":["string","array"]},"next_setup":{"description":"Optional: the set-up that follows, so the answer says what must match across the change.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"scene":{"description":"Optional: only these scene ids.","items":{"type":"string"},"type":["string","array"]},"takes":{"additionalProperties":true,"description":"The take log: a dpl.takes/1 JSON object, {format, work_id, takes: [...]}. Each take has op_id, shot (the plan's shot id), kind and verdict; file names and timecodes are optional. A take log holds text about recordings: the tools take no video or audio.","type":"object"}},"required":["plan","takes"],"type":"object"},"name":"shoot_plan_coverage_status"},{"description":"Create a plan for an authenticated organisation after authoritative payment confirmation.","inputSchema":{"additionalProperties":false,"properties":{"idempotencyKey":{"maxLength":120,"minLength":1,"type":"string"},"intake":{"oneOf":[{"additionalProperties":false,"properties":{"beatLocations":{"items":{"maxLength":120,"minLength":2,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"beats":{"items":{"maxLength":240,"minLength":3,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"briefText":{"maxLength":20000,"minLength":20,"type":"string"},"constraints":{"additionalProperties":false,"properties":{"accessNotes":{"maxLength":1000,"type":"string"},"availableMinutes":{"maximum":1440,"minimum":15,"type":"integer"},"lightNotes":{"maxLength":1000,"type":"string"},"locationNotes":{"maxLength":1000,"type":"string"},"locationTransferMinutes":{"maximum":720,"minimum":0,"type":"integer"},"mobilityNotes":{"maxLength":1000,"type":"string"},"safetyNotes":{"maxLength":1000,"type":"string"},"soundNotes":{"maxLength":1000,"type":"string"}},"type":"object"},"safetyAcknowledged":{"const":true},"title":{"maxLength":120,"minLength":3,"type":"string"}},"required":["title","briefText","beats","safetyAcknowledged"],"type":"object"},{"additionalProperties":false,"properties":{"beats":{"items":{"additionalProperties":false,"properties":{"actionSeconds":{"maximum":3600,"minimum":5,"type":"integer"},"beatId":{"pattern":"^B-[0-9]{2}$","type":"string"},"continuousMinutes":{"maximum":480,"minimum":1,"type":"integer"},"dependsOn":{"description":"Earlier stages that must finish first. Omit to follow the preceding process/result stage in input order. Use [] only for a genuinely independent or already prepared result.","items":{"pattern":"^B-[0-9]{2}$","type":"string"},"maxItems":19,"type":"array","uniqueItems":true},"eventStartFlexible":{"const":true},"eventStartMinute":{"maximum":1440,"minimum":0,"type":"integer"},"keyDetail":{"maxLength":160,"minLength":3,"type":"string"},"label":{"maxLength":120,"minLength":3,"type":"string"},"locationId":{"pattern":"^L-[0-9]{2}$","type":"string"},"participantIds":{"items":{"pattern":"^P-[0-9]{2}$","type":"string"},"maxItems":12,"type":"array","uniqueItems":true},"purpose":{"enum":["interview_answer","voiceover_line","process_step","result_reveal","place_context","closing_action","live_moment","dialogue_exchange"]},"repeatable":{"description":"Whether this key moment can be filmed again. When omitted, it is treated as not confirmed repeatable, so it is planned as one take.","enum":["yes","no","unknown"]},"requirementIds":{"items":{"pattern":"^RQ-[0-9]{2}$","type":"string"},"maxItems":10,"minItems":1,"type":"array","uniqueItems":true},"speech":{"enum":["none","on_camera","voiceover"]}},"required":["beatId","label","purpose","requirementIds","locationId"],"type":"object"},"maxItems":20,"minItems":1,"type":"array"},"context":{"description":"Optional private context. Never interpreted or used to change the plan.","maxLength":20000,"type":"string"},"intakeVersion":{"const":2},"locations":{"items":{"additionalProperties":false,"properties":{"accessWindow":{"additionalProperties":false,"properties":{"endMinute":{"maximum":1440,"minimum":1,"type":"integer"},"startMinute":{"maximum":1440,"minimum":0,"type":"integer"}},"required":["startMinute","endMinute"],"type":"object"},"acoustics":{"enum":["quiet","noise_controllable","noise_fixed","unknown"]},"locationId":{"pattern":"^L-[0-9]{2}$","type":"string"},"name":{"maxLength":120,"minLength":2,"type":"string"},"quieterPosition":{"enum":["permitted","not_permitted","unknown"]}},"required":["locationId","name"],"type":"object"},"maxItems":4,"minItems":1,"type":"array"},"noAiImagery":{"const":true,"description":"Legacy compatibility field; omit or send true. The customer films their own material."},"ownFootageOnly":{"const":true,"description":"Customer films their own material. Same meaning as noAiImagery; omit or send true."},"participants":{"items":{"additionalProperties":false,"properties":{"label":{"maxLength":80,"minLength":1,"type":"string"},"participantId":{"pattern":"^P-[0-9]{2}$","type":"string"},"window":{"additionalProperties":false,"properties":{"endMinute":{"maximum":1440,"minimum":1,"type":"integer"},"startMinute":{"maximum":1440,"minimum":0,"type":"integer"}},"required":["startMinute","endMinute"],"type":"object"}},"required":["participantId","label"],"type":"object"},"maxItems":12,"type":"array"},"planningConstraints":{"additionalProperties":false,"properties":{"availableMinutes":{"maximum":1440,"minimum":15,"type":"integer"},"cameraMovement":{"enum":["free","locked_position"]},"framingLimit":{"enum":["any","wide_only"]},"multiOrientationMethod":{"enum":["separate_takes","crop_from_one","unknown"]},"orientations":{"items":{"enum":["landscape","portrait","square"]},"maxItems":2,"minItems":1,"type":"array","uniqueItems":true},"transferMinutes":{"maximum":720,"minimum":0,"type":"integer"},"transfers":{"items":{"additionalProperties":false,"properties":{"fromLocationId":{"type":"string"},"minutes":{"maximum":720,"minimum":0,"type":"integer"},"toLocationId":{"type":"string"}},"required":["fromLocationId","toLocationId","minutes"],"type":"object"},"maxItems":6,"minItems":1,"type":"array"}},"type":"object"},"requirements":{"items":{"additionalProperties":false,"properties":{"importance":{"enum":["essential","useful","optional"]},"requirementId":{"pattern":"^RQ-[0-9]{2}$","type":"string"},"text":{"maxLength":240,"minLength":3,"type":"string"}},"required":["requirementId","text","importance"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"},"resources":{"additionalProperties":false,"properties":{"captureDevices":{"maximum":4,"minimum":1,"type":"integer"},"equipment":{"items":{"enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]},"minItems":1,"type":"array","uniqueItems":true},"operators":{"maximum":4,"minimum":1,"type":"integer"}},"type":"object"},"safetyAcknowledged":{"const":true},"title":{"maxLength":120,"minLength":3,"type":"string"}},"required":["intakeVersion","title","requirements","locations","beats","safetyAcknowledged"],"type":"object"}]},"orderId":{"description":"The order id, or the customer-facing order reference shown on the website (for example A140A800).","type":"string"}},"required":["orderId","intake","idempotencyKey"],"type":"object"},"name":"shoot_plan_create"},{"description":"Says what changed between two versions of a plan, so that you can catch up from a few lines instead of reading both. It compares by id, not by position, so reordering changes nothing: it lists what was added, what was removed, what changed (with the old and new values), and an id that has gone while another has appeared with the same content, which may be a rename: only a person can say. With the check results for both versions it also says which findings are new, which are resolved and which are unchanged. Input: old and new, two dpl.plan/1 objects; optionally old_findings and new_findings, the dpl.findings/1 documents shoot_plan_check returned for each: send both or neither. Output: dpl.diff/1. A plan that does not validate is refused with its diagnostics. Both plans are in one request, so the size limit is for the two together. No AI model runs. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"new":{"additionalProperties":true,"description":"The later version of the plan: a dpl.plan/1 JSON object.","type":"object"},"new_findings":{"additionalProperties":true,"description":"Optional: the dpl.findings/1 document shoot_plan_check returned for the new plan. Send it together with old_findings.","type":"object"},"old":{"additionalProperties":true,"description":"The earlier version of the plan: a dpl.plan/1 JSON object.","type":"object"},"old_findings":{"additionalProperties":true,"description":"Optional: the dpl.findings/1 document shoot_plan_check returned for the old plan. Send it together with new_findings.","type":"object"}},"required":["old","new"],"type":"object"},"name":"shoot_plan_diff"},{"description":"The final check on a drafted plan: is it finished and ready to shoot? It returns ready or not ready, with a record of what was checked and what was not. A plan that does not pass gets a normal answer, not an error: the reasons are the next actions, each with its plan path and a fix. A pass is the result to show your human. It holds the plan to the format and to editing readiness, not to taste. No AI model runs. Input: plan, a dpl.plan/1 object. Output: dpl.draft-gate/1 with passed (true or false), result (ready_to_shoot or not_ready), the reasons and counts, and next_tool, the tool to call next. The engine's own wording may name its command line: ignore that and follow next_tool, which names the tool to call next and what to send. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_draft_gate"},{"description":"Says where a draft stands and the one next thing to do, so you can write a plan layer by layer and have each layer checked as you go. It reads the plan you send and never changes it. It returns the layer you have reached, what that layer still lacks as exact plan paths, the questions to put to your human (answer \"none\" in the plan when none is the honest answer; never invent a detail), the open findings of finished layers with tested fixes, and which recipe fits each scene that has no shots yet. It is quick: call it after every layer or scene. No AI model runs. Input: plan, the draft so far (a dpl.plan/1 object); optionally brief, the same brief you gave shoot_plan_draft_start (it can be used to check the runtime). Output: dpl.draft-next/1, and next_tool, the tool to call next (when the next action is to run the gate, it is shoot_plan_draft_gate). Follow next_tool. The engine's own wording may name its command line: ignore that and follow next_tool, which names the tool to call next and what to send. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"brief":{"additionalProperties":true,"description":"The brief: a dpl.brief/1 JSON object with title, target_runtime_ms (whole milliseconds) and profile (\"film\", or \"short\" for a phone or small-crew shoot); optionally logline, thesis, characters, places and, for a short, delivery, kit, people and shoot_window.","type":"object"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_draft_next"},{"description":"Starts a shot plan for you to write: from a short brief it returns a valid skeleton plan (the places to write start with TODO), the layers to write it in, shot-pattern recipes for common kinds of scene, and the first thing to do. The loop is: you write the plan, we check it. We write none of the film and no AI model runs. The brief is sent to us only to build the skeleton, and we don't keep it. Input: brief, a dpl.brief/1 object: title, target_runtime_ms and profile (\"film\", or \"short\" for a phone or small-crew shoot), and optionally logline, thesis, characters, places and, for a short, delivery, kit, people and shoot_window. Output: dpl.draft/1, with a skeleton plan that already validates, and next_tool, the tool to call next. Write the first layer into the plan, then follow next_tool. The engine's own wording may name its command line: ignore that and follow next_tool, which names the tool to call next and what to send. A brief with a mistake is refused with each problem and its fix. We don't keep the brief. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"brief":{"additionalProperties":true,"description":"The brief: a dpl.brief/1 JSON object with title, target_runtime_ms (whole milliseconds) and profile (\"film\", or \"short\" for a phone or small-crew shoot); optionally logline, thesis, characters, places and, for a short, delivery, kit, people and shoot_window.","type":"object"}},"required":["brief"],"type":"object"},"name":"shoot_plan_draft_start"},{"description":"Writes the editing guide for a film, scene by scene: what each shot is for, where to cut and why, which cutaway or insert covers which jump or crossed line, the sound to lay, and each open finding as a note about what to do in the edit. With a take log it also says which take stands for each shot and marks shots that have no usable take; without one it works from the plan alone. The tools take text only, never video or audio, and no AI model runs. Input: plan; optionally takes (a dpl.takes/1 log). Output: dpl.edit-guide/1, as JSON. We don't keep the plan or the take log. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"takes":{"additionalProperties":true,"description":"The take log: a dpl.takes/1 JSON object, {format, work_id, takes: [...]}. Each take has op_id, shot (the plan's shot id), kind and verdict; file names and timecodes are optional. A take log holds text about recordings: the tools take no video or audio.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_edit_guide"},{"description":"Return a synthetic example plan generated by the real planner, with its provenance.","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"name":"shoot_plan_example"},{"description":"Makes a first assembly edit from the plan and the take log, as a file your own editing software opens: OpenTimelineIO (otio), FCPXML (fcpxml), a CMX 3600 edit decision list (edl) or an ALE log (ale). It puts the chosen takes in story order, each as long as the plan's slot (a shot with no usable take is left as a gap and listed in the report), linked by your human's own file names so they relink to footage on their own drives. No media is uploaded to us and none comes back; no AI model runs. Input: plan; takes (a dpl.takes/1 log); format (otio, fcpxml, edl or ale); optionally fps (24, 25, 23.976 or 29.97, a number or text; 24 if left out), drop_frame (true or false), media_root (the folder the footage is in, for relinking) and sync_sound (true by default). Output: {format, media_type, file_name, content, report, more_files?}. Save content as file_name. report lists the files to relink, the gaps, any warnings and what the chosen format cannot carry; an EDL is one file for each track, so any further files are in more_files, in order. We don't keep the plan or the take log. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"drop_frame":{"description":"Optional: drop-frame timecode. Default false.","type":"boolean"},"format":{"description":"otio, fcpxml, edl or ale.","enum":["otio","fcpxml","edl","ale"]},"fps":{"description":"Frame rate: 24, 25, 23.976 or 29.97 (a number or text). Optional.","type":["number","string"]},"media_root":{"description":"Optional: the folder the footage is in, for relinking.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"sync_sound":{"description":"Optional: include sync sound where the log has it. Default true.","type":"boolean"},"takes":{"additionalProperties":true,"description":"The take log: a dpl.takes/1 JSON object, {format, work_id, takes: [...]}. Each take has op_id, shot (the plan's shot id), kind and verdict; file names and timecodes are optional. A take log holds text about recordings: the tools take no video or audio.","type":"object"}},"required":["plan","takes","format"],"type":"object"},"name":"shoot_plan_export_edit"},{"description":"Prepares a plan for generating its pictures with a generator of your own: it returns the editorial intent of the film (eil.intent/1) and one generation brief per shot (eil.generation-briefs/1). We run no generator and receive no media: you give the briefs to your own. Input: plan; optional sequence and sequence_revision (names for the sequence the intent describes), visual_family (a term for the kind of picture the sequence is made of; the default is a_roll) and house_style (an object, for the briefs). Output: {intent, briefs}. A plan with validation errors is refused with its diagnostics. No AI model runs. We don't keep the plan. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"house_style":{"additionalProperties":true,"description":"Optional house style for the briefs.","type":"object"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"sequence":{"description":"Optional name for the sequence the intent describes.","type":"string"},"sequence_revision":{"description":"Optional revision label for that sequence.","type":"string"},"visual_family":{"description":"Optional visual family term; the engine lists the ones it knows if yours is not one.","type":"string"}},"required":["plan"],"type":"object"},"name":"shoot_plan_export_for_generation"},{"description":"Cuts a plan down to what the shoot can afford, without dropping a shot marked `must`: it takes out the least necessary shots one at a time, re-checking the plan after each, and tells you what each cut costs. Input: plan, and constraints: max_shots (the most shots the cut may need) and/or max_setups (the most camera set-ups; shots sharing a set-up count once). The engine refuses any other limit and says which it takes. Output: dpl.replan/1 with met (true or false; false says which limit failed, by how much and what to relax), the sacrifices, and the revised plan with its findings. Not meeting a limit is an answer, not an error. It can take several seconds on a large plan (up to 30 s here). No AI model runs; nothing is stored. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"constraints":{"additionalProperties":true,"description":"What the shoot can afford, for example {\"max_shots\": 12, \"max_setups\": 4}. A limit left out is not a constraint.","properties":{"max_setups":{"type":["integer","null"]},"max_shots":{"type":["integer","null"]}},"type":"object"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan","constraints"],"type":"object"},"name":"shoot_plan_fit_to_budget"},{"description":"Returns what you need to write or repair a plan that the checks can read: links to the JSON Schemas, the shortest valid plan, a worked example of a two-person scene that the checks find nothing wrong with, and a summary of the details that switch each check on (which is why a thin plan comes back \"not assessed\"). Call it first if you are about to write a plan. Input: none. Output: {schemas, smallest_plan, example_plan, details_that_make_checks_work, rules_of_thumb, rules_version}. No AI model runs; it needs no plan and stores nothing. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"name":"shoot_plan_format"},{"description":"Return a full plan: shots in filming order (priority must = essential), setup groups per location or visit, checklist, coverage risks, progress (item keys already ticked), progressSummary with counts, each tick's time and source (web, field or agent), and timeSummary when the plan has timing. Structured shots have a unique title and whole filming minutes (at least 1); older free-text shots omit both. Use a shot's shotId for progress. Read-only. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"taskId":{"type":"string"}},"required":["taskId"],"type":"object"},"name":"shoot_plan_get"},{"description":"List the authenticated organisation's Shoot Plans, most recently changed first, without returning private intake or full plan content. Archived plans are left out unless includeArchived is true. Each plan's taskId is the ID every other plan tool takes. Structured result: {plans:[...]}.","inputSchema":{"additionalProperties":false,"properties":{"includeArchived":{"description":"Also list plans the owner archived. Default false.","type":"boolean"}},"type":"object"},"name":"shoot_plan_list"},{"description":"Joins two take logs for the same film into one, for when two phones, an AI assistant and a script supervisor each kept a log while offline. Joining is by op_id, so a take that is in both logs counts once and merging again changes nothing. Where two logs hold different takes under one op_id, only one is kept and the clash is counted, with a fix: give one of them an op_id of its own. The tools take text only, never video or audio, and no AI model runs. Input: a and b, two dpl.takes/1 objects. Output: {takes, merge}: takes is the joined dpl.takes/1 log; merge has added, already_present and conflicts: the counts of entries new to the joined log, entries that were in both, and entries that clashed (a count can be null if the engine did not send it). When conflicts is above 0, merge.conflict_fix says what to do: look before you trust the joined log. We don't keep either take log. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"a":{"additionalProperties":true,"description":"The first take log (dpl.takes/1).","type":"object"},"b":{"additionalProperties":true,"description":"The second take log (dpl.takes/1), for the same work_id.","type":"object"}},"required":["a","b"],"type":"object"},"name":"shoot_plan_merge_takes"},{"description":"Lists the questions to put to the person who knows the film, so that more of the plan can be checked. Each question uses the plan's own names, says which paths in the plan the answer fills in and which checks it unlocks, and says whether it blocks the assessment of a scene. Do not invent an answer to silence a question: when the honest answer is none, say so in the plan with a `none` declaration (shoot_plan_format explains). Input: plan, a dpl.plan/1 object sent inline. Output: dpl.missing/1. No AI model runs; nothing is stored. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_missing_details"},{"description":"Tick or untick shots and checklist items. Each op: itemKey \"shot:<shotId>\" or \"check:<itemId>\" from shoot_plan_get, basePlanVersion = the plan's version, a new random UUID v4 as opId, state \"complete\" or \"incomplete\". Retry-safe: resending the same opId does nothing twice. An op made against an older basePlanVersion still applies when that item is unchanged in the current version; otherwise its result is item_changed_in_current_version and nothing changes. Ticking records that the person checked the shot, not its technical quality. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"ops":{"items":{"additionalProperties":false,"properties":{"basePlanVersion":{"minimum":1,"type":"integer"},"itemKey":{"pattern":"^(shot|check):","type":"string"},"opId":{"format":"uuid","type":"string"},"recordedAt":{"format":"date-time","type":["string","null"]},"state":{"enum":["complete","incomplete"]}},"required":["opId","basePlanVersion","itemKey","state"],"type":"object"},"maxItems":200,"minItems":1,"type":"array"},"taskId":{"type":"string"}},"required":["taskId","ops"],"type":"object"},"name":"shoot_plan_progress_sync"},{"description":"Calculate a deterministic public quote from non-private project metadata. Do not send a script or brief.","inputSchema":{"additionalProperties":false,"properties":{"coverageNeeds":{"items":{"enum":["interview","demonstration","dialogue","live_event","night","moving_subject","product_detail","voiceover"],"type":"string"},"type":"array","uniqueItems":true},"equipment":{"items":{"enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"],"type":"string"},"type":"array","uniqueItems":true},"locationCount":{"maximum":25,"minimum":1,"type":"integer"},"noAiImagery":{"const":true,"description":"Legacy compatibility field; omit or send true. The customer films their own material."},"orientation":{"enum":["landscape","portrait","square","mixed"],"type":"string"},"ownFootageOnly":{"const":true,"description":"Customer films their own material. Same meaning as noAiImagery; omit or send true."},"peopleCount":{"maximum":50,"minimum":0,"type":"integer"},"projectType":{"enum":["interview","promo","tutorial","event","narrative"],"type":"string"},"sceneCount":{"maximum":100,"minimum":1,"type":"integer"},"shootMinutes":{"maximum":1440,"minimum":15,"type":"integer"},"targetRuntimeSeconds":{"maximum":7200,"minimum":15,"type":"integer"}},"required":["projectType","targetRuntimeSeconds","sceneCount","locationCount","peopleCount","shootMinutes","orientation"],"type":"object"},"name":"shoot_plan_quote"},{"description":"Records a decision about one finding from shoot_plan_check (accepted, overridden or wont_fix), with the reason and who decided, so that you do not raise it again next session. We keep nothing: the answer is the updated decision log, and you must keep it and send it back to shoot_plan_check as dispositions. A finding with a remembered decision then comes back closed, with the reason, for as long as the evidence behind it is unchanged; if the evidence changes, it comes back open again. Input: plan; finding_id (a finding's id from shoot_plan_check); decision (accepted, overridden or wont_fix); reason (why, in plain words); by (who decided); optionally at (an ISO 8601 time with a zone, such as 2026-10-18T09:30:00Z; the time of the request if left out) and dispositions (the log you were given last time, to extend it: a later decision about the same finding replaces the earlier one, which stays as history). Output: dpl.dispositions/1, the log with this decision added. A finding_id the plan does not have is refused. No AI model runs. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"at":{"description":"Optional: when it was decided, an ISO 8601 time with a zone, for example 2026-10-18T09:30:00Z. The time of the request if left out.","type":"string"},"by":{"description":"Who decided: a name.","type":"string"},"decision":{"description":"accepted, overridden or wont_fix.","enum":["accepted","overridden","wont_fix"]},"dispositions":{"additionalProperties":true,"description":"The decision log: the dpl.dispositions/1 document shoot_plan_record_decision returned, exactly as returned. You keep it; we don't.","type":"object"},"finding_id":{"description":"The id of a finding in the shoot_plan_check result for this plan, for example f-3a9c51d02b7e.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"reason":{"description":"Why, in plain words. It is shown when the finding is closed by this decision.","type":"string"}},"required":["plan","finding_id","decision","reason","by"],"type":"object"},"name":"shoot_plan_record_decision"},{"description":"Use the plan's one included revision. This cannot be undone and uses up that revision, so call shoot_plan_revision_preview first and confirm with the person. For structured plans, change filming time or transfer time (constraintUpdates.availableMinutes, locationTransferMinutes), framing, or structuredChanges. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"audioPriority":{"enum":["clean"],"type":"string"},"constraintUpdates":{"additionalProperties":false,"properties":{"accessNotes":{"maxLength":1000,"type":"string"},"availableMinutes":{"maximum":1440,"minimum":15,"type":"integer"},"lightNotes":{"maxLength":1000,"type":"string"},"locationNotes":{"maxLength":1000,"type":"string"},"locationTransferMinutes":{"maximum":720,"minimum":0,"type":"integer"},"mobilityNotes":{"maxLength":1000,"type":"string"},"safetyNotes":{"maxLength":1000,"type":"string"},"soundNotes":{"maxLength":1000,"type":"string"}},"type":"object"},"framingMode":{"enum":["closer","wide_locked"],"type":"string"},"idempotencyKey":{"maxLength":120,"minLength":1,"type":"string"},"replacementBeats":{"items":{"maxLength":240,"minLength":3,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"request":{"maxLength":1000,"minLength":1,"type":"string"},"structuredChanges":{"additionalProperties":false,"description":"Structured plans only: typed changes that stay within the plan's scope.","properties":{"beatRepeatable":{"items":{"additionalProperties":false,"properties":{"beatId":{"pattern":"^B-[0-9]{2}$","type":"string"},"repeatable":{"description":"Whether this key moment can be filmed again. A one-time live moment cannot be switched to repeatable.","enum":["yes","no","unknown"]}},"required":["beatId","repeatable"],"type":"object"},"maxItems":20,"minItems":1,"type":"array"},"removeEquipment":{"items":{"enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]},"minItems":1,"type":"array","uniqueItems":true}},"type":"object"},"taskId":{"type":"string"}},"required":["taskId","request","idempotencyKey"],"type":"object"},"name":"shoot_plan_revise"},{"description":"Structured plans only; older free-text plans cannot be previewed. Preview a revision without using it: what would change, which checked shots would be cleared, and whether it still fits. For example constraintUpdates.availableMinutes: 30 answers \"what if I only had 30 minutes?\". Never uses the included revision. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"audioPriority":{"enum":["clean"],"type":"string"},"constraintUpdates":{"additionalProperties":false,"properties":{"accessNotes":{"maxLength":1000,"type":"string"},"availableMinutes":{"maximum":1440,"minimum":15,"type":"integer"},"lightNotes":{"maxLength":1000,"type":"string"},"locationNotes":{"maxLength":1000,"type":"string"},"locationTransferMinutes":{"maximum":720,"minimum":0,"type":"integer"},"mobilityNotes":{"maxLength":1000,"type":"string"},"safetyNotes":{"maxLength":1000,"type":"string"},"soundNotes":{"maxLength":1000,"type":"string"}},"type":"object"},"framingMode":{"enum":["closer","wide_locked"],"type":"string"},"replacementBeats":{"items":{"maxLength":240,"minLength":3,"type":"string"},"maxItems":20,"minItems":1,"type":"array"},"structuredChanges":{"additionalProperties":false,"description":"Structured plans only: typed changes that stay within the plan's scope.","properties":{"beatRepeatable":{"items":{"additionalProperties":false,"properties":{"beatId":{"pattern":"^B-[0-9]{2}$","type":"string"},"repeatable":{"description":"Whether this key moment can be filmed again. A one-time live moment cannot be switched to repeatable.","enum":["yes","no","unknown"]}},"required":["beatId","repeatable"],"type":"object"},"maxItems":20,"minItems":1,"type":"array"},"removeEquipment":{"items":{"enum":["phone","camera","tripod","gimbal","external_microphone","lights","drone"]},"minItems":1,"type":"array","uniqueItems":true}},"type":"object"},"taskId":{"type":"string"}},"required":["taskId"],"type":"object"},"name":"shoot_plan_revision_preview"},{"description":"Makes the pack to take on the shoot day: the call sheet with, for each scene, its shots, the action, the look and the sound notes. Use it when the crew needs one document to work from; use shoot_plan_call_sheet when only the times and people are wanted. Input: plan, a dpl.plan/1 object that validates; optionally day, the id of one day in the plan's schedule (a day the plan does not have is refused, and the refusal lists the days it has). Output: dpl.shoot-pack/1. No AI model runs; we don't keep the plan. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"day":{"description":"Optional: the id of one shoot day in the plan's schedule, for example day1. Leave it out for the whole schedule.","type":"string"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_shoot_pack"},{"description":"Turns a plan into a shot list a crew can work from. Input: plan; format, \"json\" (default, dpl.shot-list/1) or \"markdown\"; vocabulary, an optional industry vocabulary for camera terms (for example \"movielabs@1.0\"). Output: the shot list, or {format:\"markdown\", markdown}. No AI model runs. We don't keep the plan. Needs an agent key from a Shoot Plan account, and is free up to 3 projects a month. A project is identified by the plan's work id and title; it counts when this tool first makes a finished document for it that month. shoot_plan_allowance says what is left. Over the limit it answers ALLOWANCE_REACHED: do not retry, a new key will not help, tell your human. A fair-use limit also applies: up to 20 finished-document calls for any one project and 60 for the account each month. To count projects we keep, against your account, a one-way fingerprint (hash) of the project's id and title, the month, how many finished documents were made and when, for 13 months after the end of that month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"format":{"description":"json (default) or markdown.","enum":["json","markdown"]},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"vocabulary":{"description":"Optional industry vocabulary for camera terms, for example movielabs@1.0.","type":"string"}},"required":["plan"],"type":"object"},"name":"shoot_plan_shot_list"},{"description":"Cuts out part of a plan, so that you can send a smaller plan when your context is short: the scenes, the shots or the sequence you name, with everything they refer to (characters, places, props, sound and the rest) and their times unchanged. The slice is a valid plan of its own, so you can send it to shoot_plan_check, and it says which whole plan it was cut from (slice_of). It is for reading and editing one part: to change the film, change the whole plan and check that. Input: plan, and exactly one of scenes (scene ids), shots (shot ids) or sequence (one sequence id). Ids may be a name, a comma-separated list, or a list of names. An id the plan does not have is refused, and the refusal says what to change. Output: the sliced dpl.plan/1 with slice_of. A slice of shots that leaves gaps in a scene is judged as if the shots on either side of a gap were neighbours: treat its check as advice. No AI model runs. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"scenes":{"description":"Slice these scenes: scene ids (a name, a comma-separated list, or a list of names).","items":{"type":"string"},"type":["string","array"]},"sequence":{"description":"Slice this one sequence: a sequence id.","type":"string"},"shots":{"description":"Slice these shots: shot ids (a name, a comma-separated list, or a list of names).","items":{"type":"string"},"type":["string","array"]}},"required":["plan"],"type":"object"},"name":"shoot_plan_slice"},{"description":"Return a plan's status, version, whether its included revision is used, its customer-facing order reference, and progress (essential shots ticked, next shot, when the last tick was made). Read-only. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"taskId":{"type":"string"}},"required":["taskId"],"type":"object"},"name":"shoot_plan_status"},{"description":"Gives a short account of a plan, about 300 words, so that you can pick the work up again without being sent the whole plan: the title, the planned runtime against the target, the counts of scenes, shots, characters and places, the thesis and journey, one line for each sequence and scene, the missing-details counts, and, if you pass the check result, the open findings by severity. Fetch it first when you come back to a film. The scene ids it lists are the ones to ask shoot_plan_slice for. Input: plan, a dpl.plan/1 object; optionally findings, the dpl.findings/1 document shoot_plan_check returned for this plan (without it the summary says no findings were given and does not run the checks; if they are for another revision of the plan, it says so). Output: dpl.summary/1. A plan that does not validate is refused with its diagnostics. No AI model runs. We don't keep the plan. We log a one-way fingerprint (hash) of it, its size, the tool, the type of client, the result and the time taken. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"findings":{"additionalProperties":true,"description":"Optional: the dpl.findings/1 document shoot_plan_check returned for this same plan, exactly as returned.","type":"object"},"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"}},"required":["plan"],"type":"object"},"name":"shoot_plan_summary"},{"description":"Structured plans only (not older free-text plans). Compare planned and actual filming time between consecutive ticks in field mode. plannedSeconds is the planned time of those measured tick-to-tick steps, not the whole plan; planPlannedSeconds is the whole plan's planned shot work when present. Read-only. Use the full taskId from shoot_plan_list (not planId). A unique eight-character task prefix or orderReference also works. Connections see only their own live or owner-test plans.","inputSchema":{"additionalProperties":false,"properties":{"taskId":{"type":"string"}},"required":["taskId"],"type":"object"},"name":"shoot_plan_timing"},{"description":"Converts one of your organisation's purchased Shoot Plan plans into a dpl.plan/1 plan in the short-form profile, so you can pass it to shoot_plan_check. It is the same conversion dpl-eil's reference importer makes, and it is one way only. Input: planId (the plan's planId, spp_..., as shown inside shoot_plan_get) or taskId (the full taskId from shoot_plan_list); optionally dayStart (HH:MM, default 09:00: the clock time of minute 0 of the shoot) and date (YYYY-MM-DD). Output: {plan, report}. The report lists every field of the Shoot Plan plan that has no place in DPL or was approximated, with counts, and anything it had to assume. It also uses the structured details the plan was made from (people's names, access windows, how noisy each place is) when Shoot Plan holds them; where it does not, those come back as gaps. The private context text is never used. Read-only: the Shoot Plan plan is not changed and the DPL plan is not stored, so keep it yourself. The plan must belong to the organisation of your agent key. Needs an agent key from a Shoot Plan account, and a Shoot Plan you have bought. No AI model runs. It never counts toward the monthly allowance. Documents made from a plan you have bought do not use up a project, but they do count towards the fair-use limits. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"date":{"description":"Optional shoot date, YYYY-MM-DD.","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2}$","type":"string"},"dayStart":{"description":"Clock time of minute 0 of the shoot, HH:MM. Default 09:00.","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"planId":{"description":"The plan's planId (spp_...), as shown inside shoot_plan_get. Give this or taskId.","type":"string"},"taskId":{"description":"The taskId from shoot_plan_list. Give this or planId.","type":"string"}},"type":"object"},"name":"shoot_plan_to_dpl"},{"description":"Checks a log of takes against the plan it was shot from, before you rely on it. It finds shots that are not in the plan, take numbers used twice, one op_id used for two different takes, file names written as paths, and a log made for another film or another revision of the plan. Each problem has a path into the log and a fix. A log with errors is a normal answer, not an error. The log is text about recordings (shot ids, verdicts, file names, timecodes). The tools take text only, never video or audio, and no AI model runs. Input: plan (a dpl.plan/1 object) and takes (a dpl.takes/1 object). Output: dpl.diagnostics/1 with valid (true or false) and each diagnostic with its fix. We don't keep the plan or the take log. Needs an agent key from a Shoot Plan account. Free, and it does not count toward the account's 3 free projects a month. Plans up to 8 MB and 120 calls a minute (5,000 a day).","inputSchema":{"additionalProperties":false,"properties":{"plan":{"additionalProperties":true,"description":"The plan itself: a dpl.plan/1 JSON object (not text inside a string). Call shoot_plan_format for the schema links and an example.","type":"object"},"takes":{"additionalProperties":true,"description":"The take log: a dpl.takes/1 JSON object, {format, work_id, takes: [...]}. Each take has op_id, shot (the plan's shot id), kind and verdict; file names and timecodes are optional. A take log holds text about recordings: the tools take no video or audio.","type":"object"}},"required":["plan","takes"],"type":"object"},"name":"shoot_plan_validate_takes"}]},"body_sha256":"96498e983ae494667961803298968587eb0dae3884c2ce2de26e463d3c2dfec4","prev_id":null,"leaf":"0x66ed0bc8287015474305259cf7275d3254582e1a5830f54ca3a713e4d0351f76","leaf_text":"{\"body\":\"96498e983ae494667961803298968587eb0dae3884c2ce2de26e463d3c2dfec4\",\"id\":382675,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793059528020790,\"prev\":null,\"subject\":\"bf3c1070-f0b1-4911-80f7-8f9d6baf2034\",\"subject_kind\":\"endpoint\"}","day":null,"proof":[]}