MCP App Store
by KeenEthics
Shape Construction icon

Shape Construction

By Shape

Get New App Alerts

Overview

Shape Construction connects your Shape projects to ChatGPT. Ask questions about what’s happening on site and get answers from your live project data, without switching apps. Find open issues, catch up on shift reports, check weekly work plans, look up documents and see who’s involved in a project, all in the conversation. The plugin only reads data. It can search and read your Shape records, but it can’t create, change or delete anything. You sign in with your own Shape account, and it only sees the projects and records you can already see in Shape. Key features Issues: search and review issues across your projects, including their status and progress. Shift reports: catch up on what happened on site, by day or across a period. Weekly work plans: see what’s planned and how it’s going. Documents: find and look up documents stored in Shape. People: see who’s working on a project and their role. Read-only and secure: nothing in Shape is changed, and your existing access rights always apply.

Tools

get_activity

ChatGPT
Fetch one activity with full detail. Adds what list rows omit: blocker counts (blockers), the readiness state recorded before work started, and task_identifier, which ties site work to a programme activity. Use it before relying on exact planned or actual dates, or when a progress log or shift-report line points at an activity_id. Progress logs are not included — list_progress_logs with activity_id returns them.

get_change

ChatGPT
Fetch one change with full detail, including its summary, comment, narrative and linked_records_count. The evidence behind it is in get_change_linked_records (linked issues, downtimes and progress logs), list_change_documents (documents) and get_change_events (history). An unknown id returns an error naming the project's closest-matching change ids.

get_change_events

ChatGPT
Walk a change's activity feed, newest first: record links and unlinks, status changes, exports, archivals and field edits. Use it to establish when and how a change evolved. Edits are update events with before/after text under parameters.changes; long text is cut at 240 characters with its full length in <key>_chars. The current text is on get_change. Pass next_cursor back as cursor for the next page.

get_change_linked_records

ChatGPT
List the records linked to a change — the issues, downtimes and progress-log entries behind it — as full record detail: downtime hours and causal type, progress-log narrative and figures, the owning shift report and attached documents. Each row carries its own change_signal ref, and signalable_id points at the source record. Only linked records appear; list_downtime_records and list_progress_log_records also return evidence not yet linked to any change.

get_contract

ChatGPT
Fetch one contract with full detail. Adds the free-text description, which is where the form of contract (NEC4 ECC, JCT, FIDIC, bespoke) is recorded when it is recorded at all — the title alone does not establish the form. Also returns contractor_people and contracted_people, the individuals named for each party (match user_id to list_people rows for role and title); an empty list means none are recorded, not that the party has no representatives. The contract documents themselves are in list_contract_files.

get_document

ChatGPT
Fetch one document's metadata: caption, filename, kind, MIME type, size, the location it is attached to, the uploader when known, and time-limited download_url / inline_url links. It does not return the file's contents.

get_issue

ChatGPT
Fetch one issue with full detail: title, category, state, reference number, description, observed/closed dates, delay window, impact, work affected, due date, location, discipline, assignee, observer and the person who raised it. Comments, history and status statements are not included: get_issue_feed returns the activity feed with comments, and get_issue_status_statements the dated status history.

get_issue_feed

ChatGPT
Walk an issue's activity feed, newest first, including its comments. visibility='public' (default) is the audit trail: creation, field edits (update events, including project-wide custom fields), assignments and their accept/reject outcomes, status changes, approvals, watcher and team changes, uploads and public comments. visibility='team' is a separate stream, not a superset: only the user's own team's private comments and team-scoped custom-field edits. Comment text is in parameters.body. Embedded comments and uploaded documents get their own comment / document entries in ref_index. Pass next_cursor back as cursor for the next page.

get_issue_images

ChatGPT
List the images attached to an issue, newest first. kind='evidence' returns completion-evidence photos (before/after), kind='image' ordinary attachments. Each row's ref points at the underlying document, so it can be cited or passed to get_document. The whole matching list is fetched and cut to limit; total_count counts matches before the cut and truncated says whether any were cut.

get_issue_quality_indicators

ChatGPT
Fetch data-completeness scores for an issue: how fully its description, category, discipline, location, due date, impact, attachments and staleness are filled in, each as percentage: {completed, total}. This measures record completeness only, not whether the issue substantiates a change or a commercial position.

get_issue_records

ChatGPT
Find the records raised from an issue under one contract, and the changes they feed: has the issue been raised commercially, or is it unclaimed evidence? contract_id is required and the answer covers that contract only; an issue can fall under several contracts. raised_change_ids is the commercial answer; empty while data is non-empty means evidence was logged but no change raised. Downtimes logged against the issue are not found here — get_record on a downtime record shows its issue_id. The sweep reads up to max_pages of the contract's issue records. Only coverage.complete shows the issue was never raised under the contract; otherwise an unswept page may still hold a record, and a higher max_pages reads further. Records this user may not see cannot match.

get_issue_status_statements

ChatGPT
List an issue's dated status statements, newest first — the running 'latest status' history written on the issue, which get_issue does not include. Each statement names its author (author_person_id, author_person_name). The whole list is fetched and cut to limit; total_count is the count before the cut and truncated says whether statements were cut.

get_progress_log

ChatGPT
Fetch one progress log with what list rows omit: the previous log's completion on the same activity (subtract to get the progress this log claims) and the owning activity's identity. Attached documents are counted (document_count), not embedded; a non-zero count means corroborating evidence exists.

get_project

ChatGPT
Return the project's detail: name, short code, status, IANA timezone and language. Use it when a relative date ("this week", "yesterday") must be resolved in the project's timezone. language is the project team's working language locale.

get_record

ChatGPT
Fetch one record (change evidence) with its detail: for a downtime, the hours lost, causal type, linked issue and the shift report (with its report date) it was logged on; for a progress log, the description, site comment, date, percentage complete, quantity and the instructed / problem-sourced flags. Attached documents come back as citeable records. Takes ids from list_downtime_records, list_progress_log_records and get_change_linked_records. If accessible is false the user may not see the underlying record and only identifiers return (record_type = redacted): the record exists but is not visible to this user, which is not the same as an empty record.

get_shift_report

ChatGPT
Fetch one shift report's header: title, state, report date, author, approver, publisher, publication and archive status, contractor and document count. The site-diary content (progress rows, downtimes, labour, plant, materials, SHE notes) is in get_shift_report_sections; discussion is in get_shift_report_comments.

get_shift_report_comments

ChatGPT
Walk a shift report's comments, newest first. visibility='public' (default) is readable once the report is published; 'collaborators' is internal discussion, readable only by the author, collaborators and reviewers. Each comment names its author (author_person_id, author_person_name). Attachment document ids are listed per comment and can be passed to get_document. Pass next_cursor back as cursor for the next page.

get_shift_report_people

ChatGPT
List the people with access to a shift report — authors, collaborators and team members with report visibility — not the labour on site (that is contract_forces in get_shift_report_sections). Without search the list is name-ordered; with it, results are ranked by relevance across name, email, job title, construction role and organisation name, so a truncated result is not "the first N alphabetically". The whole list is fetched and cut to limit; coverage.total_entries is the matching count.

get_shift_report_sections

ChatGPT
Fetch the site-diary content of a shift report: progress rows (activities), downtimes (with hours lost and causal type), labour (contract_forces with hours), plant (equipment), materials and SHE notes, plus report-level notes and weather. Labour, plant and material rows carry per-line allocations tying their hours to specific activity or downtime rows — the quantification data for downtime and change costing. Every line names its author (author_person_id, author_person_name). Linked activity, issue, progress-log and author ids are citeable and appear in ref_index.

health_check

ChatGPT
Check that the Shape connection works: returns the round-trip latency of Shape's liveness probe in milliseconds and which Shape build answered, with one upstreams entry per Shape service probed. Takes no arguments, needs no sign-in and reads no project data.

list_activities

ChatGPT
List the project's planned site activities, filtered by planned-start date range (date_from / date_to), status and location_id. Rows carry planned starts_at / ends_at, actual_start_date / actual_end_date, percentage_completed and expected_finish_date. The date filter bounds the planned start, not when work was recorded — recorded work is in list_progress_logs and get_shift_report_sections. Use search_activities when the user names the work in words, get_activity for blockers, readiness and task_identifier. Capped at 50 with no cursor; read coverage and narrow the filters when it is incomplete.

list_change_documents

ChatGPT
List a change's document gallery: documents attached to the change plus those inherited from every linked record (site photos on downtimes, instructions on issues, progress-log attachments) — the full evidence set in one call. Filter by kind ('file' or 'image'), location_id or created date (created_start / created_end). Each row has time-limited download_url / inline_url links; re-list to refresh. Pass next_cursor back as cursor for the next page.

list_changes

ChatGPT
List the project's changes (change orders / potential compensation events), optionally by contract_id — the way to reach an organisation's changes, as there is no organisation filter — or alerts_only for changes flagged for a notification-deadline alert. Rows carry status, category, estimated impacts, working_days_of_delay, free-text cost, notice state (formally_notified_date, signals_alert_at) and attribution (org_id raised it, responsible_org_id resolves it, person_id is the raiser). The narrative, linked records and documents come from get_change, get_change_linked_records and list_change_documents. Capped at 50 with no cursor; coverage says whether the page holds every match.

list_contract_files

ChatGPT
List the files attached to a contract, newest first — the contract documents themselves: the signed form of contract, addenda, variations, schedules, programmes, drawings, specifications, employer's requirements, warranties, bonds, letters of intent and side letters. Returns the contract's document files and their metadata. Each file has a download_url that expires after 12 hours; re-list to refresh. The whole list is fetched and cut to limit; coverage.total_entries is the full count.

list_contracts

ChatGPT
List the contracts the user's organisation is a party to on the project, optionally narrowed to one organisation on either side. contractor_org_id matches contracts that organisation holds (as client or main contractor); contracted_org_id matches contracts it works under (as supplier or subcontractor). An organisation can sit on either side across contracts, so check both directions. Rows carry party ids (names via list_orgs) and alert_period_days, the notice lead time; get_contract adds the description where the contract form is recorded. An empty result means no visible matching contract, not that the project has none; coverage says whether the set is complete.

list_custom_fields

ChatGPT
List the custom fields visible to the authenticated user on the project. Pass a field's id as custom_field_id (with custom_field_value) in the list_issues / search_issues filters. Visibility follows the user's own organisation membership; there is no organisation filter. coverage says whether the page is complete.

list_disciplines

ChatGPT
List the project's disciplines (the trade/role taxonomy). Disciplines form a tree via parent_discipline_id, and the same name can appear under several parents, so identify a discipline by its parent as well as its name. selectable_only=true keeps only selectable leaves, false only the category nodes above them; omit it for both. coverage says whether the page is complete.

list_documents

ChatGPT
List the project's documents, newest first. Pass the returned next_cursor back as cursor for the next page. There is no filter by parent record: list_change_documents, list_people_log_documents, get_issue_images and list_contract_files return the documents attached to a specific record, and search_documents matches by caption.

list_downtime_records

ChatGPT
List a contract's downtime records — lost time logged on shift reports, the primary evidence for disruption, prolongation and lost-time claims. Includes records not yet linked to any change (linked_change_ids empty), so it finds evidence no change has been raised against. contract_id is required; for a project-wide view, repeat per contract from list_contracts. status: unprocessed for the untriaged queue, all for everything. Rows omit hours lost and documents — get_record returns them. Pass next_cursor back as cursor for the next page.

list_issues

ChatGPT
List the project's issues, filtered by state (status), category (issue_type), published-date range (date_from / date_to), location_id, or a custom-field value (custom_field_id + custom_field_value). Use it for structured questions; use search_issues when the user describes an issue in words. Rows are summaries with the delay window, impact, critical flag, assignee, observer and the person who raised it; get_issue adds the description, location and discipline. Capped at limit with no cursor; coverage says whether the page holds every match.

list_locations

ChatGPT
List the project's location hierarchy, optionally narrowed to the subtree under parent_id. Each row carries name, short_code and parent_id, so the tree can be walked or a duplicate name (two "Bay 3"s under different levels) told apart by parent. Use it to place search_locations candidates in the hierarchy or to enumerate a level's children. Without parent_id it returns the whole tree, capped by limit; coverage says whether rows were cut.

list_orgs

ChatGPT
List the organisations (parties) on the project. display_name is the name users see in Shape; resolve organisation ids on contracts, changes and people against these rows. Each entry may carry linked_org, the registered organisation it belongs to (including the authenticated user's role there); null when not linked. The whole list is fetched and cut to limit; coverage.total_entries is the full count.

list_people

ChatGPT
List the people on the project with their roles, optionally filtered by role. Each row is one person's project membership, with user_id and org_id for matching against contracts, changes and organisations. Former members are included with status 'archived', so every person another tool names as an author, assignee or observer is here; someone who left and rejoined has a row per membership under one user_id, and other tools name them by the current one. coverage says whether the page is the whole matching set.

list_people_log_allocations

ChatGPT
List how a people log's hours are allocated to progress logs — a person's day can split across several. Each row embeds the target progress log with its citation ref; the parent people log carries its own. Allocations need not add up to the log's hours: on logs from shift reports, downtime allocations and activities without a progress log are not included, so a shortfall is not idle time — read downtime from get_shift_report_sections. Logs raised from a progress log do reconcile. The whole list is fetched and cut to limit; coverage.total_entries is the full count.

list_people_log_documents

ChatGPT
List the documents attached to a people log (timesheets, sign-in sheets, site photos), filterable by kind ('file' or 'image'), location_id and created date (created_start / created_end). Each row has time-limited download_url / inline_url links; re-list to refresh. Pass next_cursor back as cursor for the next page.

list_people_logs

ChatGPT
List the project's people logs, newest date first — the labour ledger of who was on site, for how long and for which organisation. Filter by date or date_start / date_end, person_resource_id, organisation_resource_id or shift_report_id. One row is one recording of one person on one date. Several rows per person and date are normal (day and night shifts, two contract-force lines, shift-report plus progress-log rows) and are not duplicates: a person's day is the sum of their rows. Where shift_report_id is set the row repeats that report's contract-force hours rather than adding to them; where it is null the row came from a progress log and appears nowhere else. Only the user's own organisation's logs are visible, and a log exists only where someone recorded the person: an empty result is not evidence of absence (check contract_forces in get_shift_report_sections). list_people_log_allocations splits a log's hours. Pass next_cursor back as cursor for the next page.

list_progress_log_records

ChatGPT
List a contract's progress logs flagged as change evidence — the site record of what was done, how far it got, and whether the work was instructed or problem-sourced. Includes records not yet linked to any change (linked_change_ids empty). contract_id is required; for a project-wide view, repeat per contract from list_contracts. status: unprocessed for the untriaged queue, all for everything. Rows omit the narrative, completion figures and documents — get_record returns them. list_progress_logs lists every log, flagged or not. Pass next_cursor back as cursor for the next page.

list_progress_logs

ChatGPT
List the project's progress logs — every log, not only those flagged as change evidence (list_progress_log_records). Filter by date or date_start / date_end, activity_id, shift_report_id or location_id to reconstruct what happened on an activity, in one shift report or over a period. Rows carry the narrative, completion figures and instructed / problem-sourced flags; get_progress_log adds the previous-log delta and the owning activity. Pass next_cursor back as cursor for the next page.

list_projects

ChatGPT
List the authenticated user's Shape projects, archived ones included (see status): the entry point to the other tools, which each read one of these projects. A project the user was invited to but has not joined is listed and cannot be read yet. The whole list, from every Shape region, comes back in one response, cut to limit; coverage.total_entries is the full count when every region answered, and next_cursor is always null. Each project names its region. get_project returns a project's timezone and language.

list_shift_reports

ChatGPT
List the project's shift reports (daily site diaries), filtered by report_date range, state or author. Published and archived reports come latest report date first; draft and in-review reports, newest created first. Rows are headers: title, state, author, publication and archive status, contractor and document count. Use it for report coverage over a period — which days have a report, which are drafts — and for who wrote them: with filters.author_person_id, coverage.total_entries is that person's report count in the selected state (unset: published, not archived). A null published_at is a draft the site team has not published; an archived report was withdrawn from the live record. Sections are in get_shift_report_sections, discussion in get_shift_report_comments. next_cursor is the paging signal: pass it back as cursor for the next page.

list_weekly_work_plans

ChatGPT
List the project's weekly work plans as summaries, optionally by state. Each row carries week_start_date, week_end_date, state, published_at and ppc — Percent Plan Complete, the recorded ratio of commitments met that week. A plan's work items are not available from any tool; planned work is in list_activities. Pass limit explicitly: the default is 20 and the maximum 50. No cursor; coverage says whether the page is complete.

search_activities

ChatGPT
Find activities whose text matches a phrase the user used, with the same date, status and location filters as list_activities. Matching is fuzzy text similarity on stored text: it tolerates misspellings but not paraphrase: "gate blocked" may miss "access restricted". An empty result covers the supplied wording only. list_activities supports structured date, status and location queries without a text match. Returns at most 20 rows with no cursor; coverage says whether more matched.

search_documents

ChatGPT
Search the project's documents by caption. Matching is fuzzy text similarity: tolerant of misspellings, not of paraphrase. Returns at most 20 results with no pagination; coverage says whether more matched. Use list_documents to browse newest first.

search_issues

ChatGPT
Find issues whose text matches words the user used, with the same filters as list_issues. Fuzzy text match on stored text (title, description, reference): tolerant of misspellings, not of paraphrase. An empty result covers the supplied wording only. list_issues supports structured state, category, date range, location and custom-field queries without a text match. Rows are summaries; get_issue adds the description, location and discipline. Capped at limit with no cursor; coverage says whether the page holds every match.

search_locations

ChatGPT
Resolve a location name or short code the user typed to its UUID — the location_id that issue, activity, progress-log and document filters take. Fuzzy text match against name and short_code, ranked by similarity: tolerant of misspellings, not of paraphrase. When several rows are plausible, list_locations with parent_id shows where each sits rather than picking one on name alone. Capped by limit with no cursor; coverage says whether more matched.

Capabilities

Search And Review IssuesCatch Up On Shift ReportsCheck Weekly Work PlansFind And Look Up DocumentsSee Who’S Involved In A Project

Example Prompts

Click any prompt to copy it.

Similar Apps