@meterapp/car-image-sdk 1.25.0 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/client.d.ts +48 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +145 -1
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +455 -9
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +205 -13
- package/dist/mcp/index.js.map +1 -1
- package/dist/types.d.ts +144 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/mcp/index.js
CHANGED
|
@@ -45,8 +45,11 @@ export const MCP_SERVER_INFO = {
|
|
|
45
45
|
export const MCP_SERVER_CAPABILITIES = { tools: { listChanged: false } };
|
|
46
46
|
/**
|
|
47
47
|
* Which tools a server exposes. `core`, the default, is what an agent needs to
|
|
48
|
-
* look a vehicle up, render it and watch the balance
|
|
49
|
-
* the public surface found
|
|
48
|
+
* look a vehicle up, render it and watch the balance (the 2026-09-29 audit of
|
|
49
|
+
* the public surface found those carrying all of the MCP traffic), plus the
|
|
50
|
+
* four feedback tools every fleet product puts in its default list
|
|
51
|
+
* (docs/customer-feedback.md): request a feature, report an issue, upvote,
|
|
52
|
+
* review. `all`
|
|
50
53
|
* adds make logos, 3D models, image options, the API reference, pricing, help
|
|
51
54
|
* and billing links, plus the tools that are served but kept out of the public
|
|
52
55
|
* reference ({@link MCP_UNLISTED_TOOLS}), for hosts that opt in (`?toolset=all`
|
|
@@ -55,7 +58,19 @@ export const MCP_SERVER_CAPABILITIES = { tools: { listChanged: false } };
|
|
|
55
58
|
* the core tools first: tools/list order is what a host shows.
|
|
56
59
|
*/
|
|
57
60
|
export const MCP_TOOLSETS = {
|
|
58
|
-
core: [
|
|
61
|
+
core: [
|
|
62
|
+
"resolve_vehicle",
|
|
63
|
+
"search_vehicles",
|
|
64
|
+
"decode_vin",
|
|
65
|
+
"check_vehicles",
|
|
66
|
+
"get_car_image",
|
|
67
|
+
"create_car_image_urls",
|
|
68
|
+
"get_account",
|
|
69
|
+
"request_feature",
|
|
70
|
+
"report_issue",
|
|
71
|
+
"upvote_feedback",
|
|
72
|
+
"submit_review",
|
|
73
|
+
],
|
|
59
74
|
all: [
|
|
60
75
|
"resolve_vehicle",
|
|
61
76
|
"search_vehicles",
|
|
@@ -64,6 +79,16 @@ export const MCP_TOOLSETS = {
|
|
|
64
79
|
"get_car_image",
|
|
65
80
|
"create_car_image_urls",
|
|
66
81
|
"get_account",
|
|
82
|
+
"request_feature",
|
|
83
|
+
"report_issue",
|
|
84
|
+
"upvote_feedback",
|
|
85
|
+
"submit_review",
|
|
86
|
+
"list_feedback",
|
|
87
|
+
"get_feedback",
|
|
88
|
+
"list_my_feedback",
|
|
89
|
+
"remove_feedback_vote",
|
|
90
|
+
"comment_on_feedback",
|
|
91
|
+
"list_reviews",
|
|
67
92
|
"get_make_logo",
|
|
68
93
|
"create_3d_model",
|
|
69
94
|
"get_3d_model",
|
|
@@ -80,7 +105,6 @@ export const MCP_TOOLSETS = {
|
|
|
80
105
|
"rate_image",
|
|
81
106
|
"list_requests",
|
|
82
107
|
"request_vehicle",
|
|
83
|
-
"request_feature",
|
|
84
108
|
"get_request",
|
|
85
109
|
"upvote_request",
|
|
86
110
|
"comment_on_request",
|
|
@@ -90,8 +114,9 @@ export const MCP_TOOLSETS = {
|
|
|
90
114
|
};
|
|
91
115
|
/**
|
|
92
116
|
* Served on `all`, absent from the public reference since the 2026-09-30
|
|
93
|
-
* audit: image feedback (the dashboard rates images now), the
|
|
94
|
-
*
|
|
117
|
+
* audit: image feedback (the dashboard rates images now), the original
|
|
118
|
+
* request-board tools (the canonical feedback tools replace them; they keep
|
|
119
|
+
* working) and the two "about you" tools. The docs, both READMEs, the OpenAPI
|
|
95
120
|
* description and the plugin skills never name them
|
|
96
121
|
* (app/_lib/client-surface-contract.test.ts), and what the reference says
|
|
97
122
|
* `?toolset=all` adds is {@link MCP_DOCUMENTED_EXTRAS}.
|
|
@@ -100,7 +125,6 @@ export const MCP_UNLISTED_TOOLS = [
|
|
|
100
125
|
"rate_image",
|
|
101
126
|
"list_requests",
|
|
102
127
|
"request_vehicle",
|
|
103
|
-
"request_feature",
|
|
104
128
|
"get_request",
|
|
105
129
|
"upvote_request",
|
|
106
130
|
"comment_on_request",
|
|
@@ -136,6 +160,8 @@ export const MCP_INSTRUCTIONS_HEAD_LIMIT = 2048;
|
|
|
136
160
|
* instructions no longer steer an agent to them.
|
|
137
161
|
*/
|
|
138
162
|
const HEAD_MISSING = "tell the human the catalog does not carry it and stop";
|
|
163
|
+
/** When to use the feedback tools, which every toolset has. */
|
|
164
|
+
const HEAD_FEEDBACK = "Feedback (free): when a call fails in a way that looks like our bug, offer report_issue with its request_id; when the human wishes the API did something, request_feature. Both return similar items first: upvote_feedback a match instead. After real use, offer submit_review.";
|
|
139
165
|
/** The 3D cost rule, shown only where create_3d_model is a tool the host has. */
|
|
140
166
|
const HEAD_3D = `create_3d_model costs ${MODEL_3D_PRICE}, free once that vehicle/color is owned: confirm with the human before calling it. `;
|
|
141
167
|
function toolsetHas(toolset, tool) {
|
|
@@ -151,7 +177,9 @@ For an image in chat, call create_car_image_urls once with vehicle: "veh_…", v
|
|
|
151
177
|
|
|
152
178
|
If lookup confidence is low or the year differs from the request, ask before spending credits. If no match, ${HEAD_MISSING}; never silently substitute a car.
|
|
153
179
|
|
|
154
|
-
Costs: ${CREDITS_PER_IMAGE} credit per image or signed URL; lookups are free. Confirm the count and cost before a batch the human did not size. ${toolsetHas(toolset, "create_3d_model") ? HEAD_3D : ""}On (402) stop and give the human its checkout_url and price; buy credits or change a plan only when the human asks or a spending mandate they set covers it
|
|
180
|
+
Costs: ${CREDITS_PER_IMAGE} credit per image or signed URL; lookups are free. Confirm the count and cost before a batch the human did not size. ${toolsetHas(toolset, "create_3d_model") ? HEAD_3D : ""}On (402) stop and give the human its checkout_url and price; buy credits or change a plan only when the human asks or a spending mandate they set covers it.
|
|
181
|
+
|
|
182
|
+
${HEAD_FEEDBACK}`;
|
|
155
183
|
}
|
|
156
184
|
/** The tools that never cost a credit, named in the Plans paragraph for the toolset that has them. */
|
|
157
185
|
const FREE_TOOLS = ["search_vehicles", "resolve_vehicle", "decode_vin", "check_vehicles", "list_image_options", "get_account", "get_3d_model", "publish_3d_model", "describe_api"];
|
|
@@ -448,8 +476,73 @@ export const MCP_TOOL_SCHEMAS = {
|
|
|
448
476
|
note: z.string().max(2000).optional().describe("Why it is needed, body style, trim; anything that helps prioritise."),
|
|
449
477
|
}),
|
|
450
478
|
request_feature: z.object({
|
|
451
|
-
title: z.string().min(1).max(
|
|
452
|
-
body: z.string().max(
|
|
479
|
+
title: z.string().min(1).max(140).describe('Short summary, e.g. "Interior views".'),
|
|
480
|
+
body: z.string().max(5000).optional().describe("Details: the use case, what the output should look like."),
|
|
481
|
+
force: z.boolean().optional().describe("File it even though similar items exist. Only after checking that none of the returned similar items matches."),
|
|
482
|
+
}),
|
|
483
|
+
report_issue: z.object({
|
|
484
|
+
title: z.string().min(1).max(140).describe('What went wrong, in a line, e.g. "Side views of the 2024 Camry return 502". No keys or personal data.'),
|
|
485
|
+
body: z.string().max(5000).optional().describe("What was called, what was expected, what happened."),
|
|
486
|
+
request_id: z.string().min(1).max(100).optional().describe("The request_id of the failed call (from its error or X-Request-Id). The single most useful thing to attach."),
|
|
487
|
+
context: z
|
|
488
|
+
.object({
|
|
489
|
+
endpoint: z.string().max(200).optional().describe("The tool or path that failed, e.g. get_car_image or /api/v1/images/car."),
|
|
490
|
+
error_code: z.string().max(80).optional().describe("The error code or status the call returned."),
|
|
491
|
+
vehicle: z.string().max(32).optional().describe("The vehicle id (veh_…) involved."),
|
|
492
|
+
view: z.string().max(24).optional().describe("The view involved, e.g. side."),
|
|
493
|
+
color: z.string().max(24).optional().describe("The paint color involved."),
|
|
494
|
+
asset_id: z.string().max(36).optional().describe("The image asset id, when one was returned."),
|
|
495
|
+
model_3d_id: z.string().max(36).optional().describe("The 3D request id, for a 3D model problem."),
|
|
496
|
+
client: z.string().max(80).optional().describe("The host or client, e.g. Claude Code."),
|
|
497
|
+
client_version: z.string().max(40).optional().describe("Its version."),
|
|
498
|
+
})
|
|
499
|
+
.optional()
|
|
500
|
+
.describe("The identifiers of what went wrong. Checked against the account's own requests; never shown publicly."),
|
|
501
|
+
force: z.boolean().optional().describe("File it even though similar reports exist."),
|
|
502
|
+
}),
|
|
503
|
+
list_feedback: z.object({
|
|
504
|
+
kind: z.enum(REQUEST_KINDS).optional().describe("feature, issue (published ones only) or vehicle. Omit for all."),
|
|
505
|
+
status: z.enum(REQUEST_STATUSES).optional().describe("Filter by status. Omit for everything that is not declined or merged."),
|
|
506
|
+
sort: z.enum(REQUEST_SORTS).default("top").describe("top = most votes (default); new = newest; recent_activity = latest vote, comment or change."),
|
|
507
|
+
q: z.string().max(200).optional().describe("Search titles and bodies."),
|
|
508
|
+
limit: z.coerce.number().int().min(1).max(100).default(25).describe("Maximum number of items (1-100)."),
|
|
509
|
+
cursor: z.string().max(200).optional().describe("next_cursor from a previous page."),
|
|
510
|
+
}),
|
|
511
|
+
get_feedback: z.object({
|
|
512
|
+
id: z.string().uuid().describe("The item id from list_feedback, request_feature or report_issue."),
|
|
513
|
+
}),
|
|
514
|
+
list_my_feedback: z.object({
|
|
515
|
+
kind: z.enum(REQUEST_KINDS).optional().describe("Only one kind. Omit for all."),
|
|
516
|
+
status: z.enum(REQUEST_STATUSES).optional().describe("Only one status. Omit for all."),
|
|
517
|
+
limit: z.coerce.number().int().min(1).max(100).default(25).describe("Maximum number of items (1-100)."),
|
|
518
|
+
cursor: z.string().max(200).optional().describe("next_cursor from a previous page."),
|
|
519
|
+
}),
|
|
520
|
+
upvote_feedback: z.object({
|
|
521
|
+
id: z.string().uuid().describe("The item id to upvote. Idempotent."),
|
|
522
|
+
}),
|
|
523
|
+
remove_feedback_vote: z.object({
|
|
524
|
+
id: z.string().uuid().describe("The item id to remove the vote from. Idempotent."),
|
|
525
|
+
}),
|
|
526
|
+
comment_on_feedback: z.object({
|
|
527
|
+
id: z.string().uuid().describe("The item id to comment on."),
|
|
528
|
+
body: z.string().min(1).max(2000).describe("The comment (1-2000 characters)."),
|
|
529
|
+
}),
|
|
530
|
+
submit_review: z.object({
|
|
531
|
+
rating: z.coerce.number().int().min(1).max(5).describe("1 to 5 stars, the human's own rating."),
|
|
532
|
+
title: z.string().max(120).optional().describe("A headline, in the human's words."),
|
|
533
|
+
body: z.string().max(2000).optional().describe("The review, in the human's words."),
|
|
534
|
+
likes: z.string().max(1000).optional().describe("What works well."),
|
|
535
|
+
dislikes: z.string().max(1000).optional().describe("What could be better."),
|
|
536
|
+
use_case: z.string().max(200).optional().describe("What they use the API for."),
|
|
537
|
+
display_name: z.string().max(80).optional().describe("The name to show. Defaults to their first name."),
|
|
538
|
+
display_company: z.string().max(120).optional().describe("A company to show, only if they want one."),
|
|
539
|
+
marketing_consent: z.boolean().optional().describe("true only if the human agreed that Car Image may quote it in marketing. Default false."),
|
|
540
|
+
}),
|
|
541
|
+
list_reviews: z.object({
|
|
542
|
+
sort: z.enum(["newest", "highest", "lowest"]).default("newest").describe("Order of the reviews."),
|
|
543
|
+
rating: z.coerce.number().int().min(1).max(5).optional().describe("Only reviews with this rating."),
|
|
544
|
+
limit: z.coerce.number().int().min(1).max(100).default(20).describe("Maximum number of reviews (1-100)."),
|
|
545
|
+
cursor: z.string().max(200).optional().describe("next_cursor from a previous page."),
|
|
453
546
|
}),
|
|
454
547
|
get_request: z.object({
|
|
455
548
|
id: z.string().uuid().describe("The request id from list_requests, request_vehicle or request_feature."),
|
|
@@ -459,7 +552,7 @@ export const MCP_TOOL_SCHEMAS = {
|
|
|
459
552
|
}),
|
|
460
553
|
comment_on_request: z.object({
|
|
461
554
|
id: z.string().uuid().describe("The request id to comment on."),
|
|
462
|
-
body: z.string().min(1).max(
|
|
555
|
+
body: z.string().min(1).max(2000).describe("The comment (1-2000 characters)."),
|
|
463
556
|
}),
|
|
464
557
|
share_building: z.object({
|
|
465
558
|
building: z.string().min(1).max(2000).describe("What the human is building with the API, in their words (1-2000 characters)."),
|
|
@@ -623,6 +716,23 @@ const requestFields = {
|
|
|
623
716
|
updated_at: z.string(),
|
|
624
717
|
viewer: z.looseObject({ voted: z.boolean() }).optional(),
|
|
625
718
|
};
|
|
719
|
+
/** create results on the canonical tools: the new item, or nothing and the matches to upvote. */
|
|
720
|
+
const filedFeedbackResult = z.looseObject({
|
|
721
|
+
created: z.boolean(),
|
|
722
|
+
data: z.looseObject({ ...requestFields, comments: z.number().int() }).nullable(),
|
|
723
|
+
similar: z.array(z.looseObject({ ...requestFields, comments: z.number().int() })),
|
|
724
|
+
request_id: z.string(),
|
|
725
|
+
});
|
|
726
|
+
const publicReviewSchema = z.looseObject({
|
|
727
|
+
id: z.string(),
|
|
728
|
+
rating: z.number().int(),
|
|
729
|
+
title: z.string().nullable(),
|
|
730
|
+
body: z.string().nullable(),
|
|
731
|
+
display_name: z.string(),
|
|
732
|
+
created_at: z.string(),
|
|
733
|
+
response: z.looseObject({ body: z.string(), responded_at: z.string() }).nullable(),
|
|
734
|
+
});
|
|
735
|
+
const reviewSummarySchema = z.looseObject({ count: z.number().int(), average: z.number().nullable(), distribution: z.looseObject({}) });
|
|
626
736
|
const requestCommentSchema = z.looseObject({
|
|
627
737
|
id: z.string(),
|
|
628
738
|
request_id: z.string(),
|
|
@@ -649,6 +759,7 @@ const createdRequestResult = z.looseObject({
|
|
|
649
759
|
deduplicated: z.boolean(),
|
|
650
760
|
request_id: z.string(),
|
|
651
761
|
});
|
|
762
|
+
const timelineSchema = z.array(z.looseObject({ at: z.string(), type: z.string() }));
|
|
652
763
|
/** The response of GET /api/v1/vin/{vin}: every key present, unknown values null. */
|
|
653
764
|
const vinResultSchema = z.looseObject({
|
|
654
765
|
vin: z.string(),
|
|
@@ -928,7 +1039,16 @@ export const MCP_TOOL_OUTPUT_SCHEMAS = {
|
|
|
928
1039
|
publish_3d_model: z.looseObject({ data: model3dSchema, request_id: z.string() }),
|
|
929
1040
|
list_requests: requestListResult,
|
|
930
1041
|
request_vehicle: createdRequestResult,
|
|
931
|
-
request_feature:
|
|
1042
|
+
request_feature: filedFeedbackResult,
|
|
1043
|
+
report_issue: filedFeedbackResult,
|
|
1044
|
+
list_feedback: requestListResult,
|
|
1045
|
+
list_my_feedback: requestListResult,
|
|
1046
|
+
get_feedback: z.looseObject({ data: z.looseObject({ ...requestDetailSchema.shape, timeline: timelineSchema }), request_id: z.string() }),
|
|
1047
|
+
upvote_feedback: requestResult,
|
|
1048
|
+
remove_feedback_vote: requestResult,
|
|
1049
|
+
comment_on_feedback: z.looseObject({ data: requestCommentSchema, request_id: z.string() }),
|
|
1050
|
+
submit_review: z.looseObject({ data: publicReviewSchema.extend({ status: z.string(), marketing_consent: z.boolean() }), created: z.boolean(), request_id: z.string() }),
|
|
1051
|
+
list_reviews: z.looseObject({ data: z.array(publicReviewSchema), summary: reviewSummarySchema, next_cursor: z.string().nullable(), request_id: z.string() }),
|
|
932
1052
|
get_request: z.looseObject({ data: requestDetailSchema, request_id: z.string() }),
|
|
933
1053
|
upvote_request: requestResult,
|
|
934
1054
|
comment_on_request: z.looseObject({ data: requestCommentSchema, request_id: z.string() }),
|
|
@@ -1275,11 +1395,83 @@ export const MCP_TOOLS = {
|
|
|
1275
1395
|
request_feature: {
|
|
1276
1396
|
name: "request_feature",
|
|
1277
1397
|
title: "Request a feature",
|
|
1278
|
-
description: "Free.
|
|
1398
|
+
description: "Free. When the human wishes the API did something it does not (new views, formats, endpoints, anything), file it on the public feedback board. Similar items are checked first: when some exist nothing is filed (created: false) and similar lists them; upvote_feedback the one that matches, or call again with force: true if none does. A new request returns its page URL; the human gets a thank-you email and one for every status change until it ships.",
|
|
1279
1399
|
inputSchema: MCP_TOOL_SCHEMAS.request_feature,
|
|
1280
1400
|
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.request_feature,
|
|
1281
1401
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
1282
1402
|
},
|
|
1403
|
+
report_issue: {
|
|
1404
|
+
name: "report_issue",
|
|
1405
|
+
title: "Report an issue",
|
|
1406
|
+
description: "Free. Report a problem with Car Image itself (a failed or wrong render, an error that looks like a bug, a broken endpoint), with the human's agreement. Pass the failed call's request_id and what you know in context (endpoint, error_code, vehicle id, view, color): the team sees exactly what happened. Private to the human and the team. Similar open reports come back first, as with request_feature: upvote_feedback one that matches. The human gets an acknowledgement and an email when it is picked up and when it is fixed. Not for a vehicle the catalog lacks, and never include API keys.",
|
|
1407
|
+
inputSchema: MCP_TOOL_SCHEMAS.report_issue,
|
|
1408
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.report_issue,
|
|
1409
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
1410
|
+
},
|
|
1411
|
+
list_feedback: {
|
|
1412
|
+
name: "list_feedback",
|
|
1413
|
+
title: "List the feedback board",
|
|
1414
|
+
description: "Free, public. The feedback board: feature requests, vehicle requests and published issues, with votes, comments, status (open, planned, in_progress, done, declined, duplicate) and a page URL. Search with q, filter by kind or status, sort by top, new or recent_activity.",
|
|
1415
|
+
inputSchema: MCP_TOOL_SCHEMAS.list_feedback,
|
|
1416
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.list_feedback,
|
|
1417
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1418
|
+
},
|
|
1419
|
+
get_feedback: {
|
|
1420
|
+
name: "get_feedback",
|
|
1421
|
+
title: "Get a feedback item",
|
|
1422
|
+
description: "Free. One item with its comments (official: true marks the team's responses) and its timeline of status changes. A private issue is readable by its reporter only, with the context it was filed with.",
|
|
1423
|
+
inputSchema: MCP_TOOL_SCHEMAS.get_feedback,
|
|
1424
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.get_feedback,
|
|
1425
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1426
|
+
},
|
|
1427
|
+
list_my_feedback: {
|
|
1428
|
+
name: "list_my_feedback",
|
|
1429
|
+
title: "List my feedback",
|
|
1430
|
+
description: "Free. What the human filed (private issues included) and what they vote on, comment on or follow, any status: use it to tell them where their requests and reports stand.",
|
|
1431
|
+
inputSchema: MCP_TOOL_SCHEMAS.list_my_feedback,
|
|
1432
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.list_my_feedback,
|
|
1433
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1434
|
+
},
|
|
1435
|
+
upvote_feedback: {
|
|
1436
|
+
name: "upvote_feedback",
|
|
1437
|
+
title: "Upvote a feedback item",
|
|
1438
|
+
description: "Free. Add the human's vote to a feature, vehicle request or published issue (idempotent): the way to say \"me too\" instead of filing a duplicate. They follow it from then on and hear about every status change. A vote on a merged item lands on the item it was merged into.",
|
|
1439
|
+
inputSchema: MCP_TOOL_SCHEMAS.upvote_feedback,
|
|
1440
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.upvote_feedback,
|
|
1441
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1442
|
+
},
|
|
1443
|
+
remove_feedback_vote: {
|
|
1444
|
+
name: "remove_feedback_vote",
|
|
1445
|
+
title: "Remove a vote",
|
|
1446
|
+
description: "Free. Remove the human's vote from an item (idempotent); they stop following it unless they commented.",
|
|
1447
|
+
inputSchema: MCP_TOOL_SCHEMAS.remove_feedback_vote,
|
|
1448
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.remove_feedback_vote,
|
|
1449
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1450
|
+
},
|
|
1451
|
+
comment_on_feedback: {
|
|
1452
|
+
name: "comment_on_feedback",
|
|
1453
|
+
title: "Comment on a feedback item",
|
|
1454
|
+
description: "Free. Add a comment to an item, e.g. the use case or detail that matters; shown with the human's first name only.",
|
|
1455
|
+
inputSchema: MCP_TOOL_SCHEMAS.comment_on_feedback,
|
|
1456
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.comment_on_feedback,
|
|
1457
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
1458
|
+
},
|
|
1459
|
+
submit_review: {
|
|
1460
|
+
name: "submit_review",
|
|
1461
|
+
title: "Review Car Image",
|
|
1462
|
+
description: "Free. Post or edit the human's public review of Car Image (one per account, 1-5 stars, their own words; never invent or nudge a rating). Shown on the reviews page with the team's answer once it passes a quick check. Set marketing_consent only when they agree to be quoted. One edit an hour; the first post gets a thank-you email.",
|
|
1463
|
+
inputSchema: MCP_TOOL_SCHEMAS.submit_review,
|
|
1464
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.submit_review,
|
|
1465
|
+
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1466
|
+
},
|
|
1467
|
+
list_reviews: {
|
|
1468
|
+
name: "list_reviews",
|
|
1469
|
+
title: "List reviews",
|
|
1470
|
+
description: "Free, public. Published reviews of Car Image with the team's responses, plus the average rating and the 1-5 distribution.",
|
|
1471
|
+
inputSchema: MCP_TOOL_SCHEMAS.list_reviews,
|
|
1472
|
+
outputSchema: MCP_TOOL_OUTPUT_SCHEMAS.list_reviews,
|
|
1473
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
1474
|
+
},
|
|
1283
1475
|
get_request: {
|
|
1284
1476
|
name: "get_request",
|
|
1285
1477
|
title: "Get a request",
|