chore: prepare v1.9.0 release#57
Open
drewburchfield wants to merge 14 commits into
Open
Conversation
…tent redaction
(a) Add MCP annotations { readOnlyHint, openWorldHint } to all 102 tools via
listTools() map, so clients (e.g. CoWork) can auto-approve read-only calls.
(b) Fix cache falsy-miss: guard on !== undefined (not truthiness) in cache.ts,
helpscout-client.ts, helpscout-docs-client.ts so a cached 0/''/false/null
payload is a hit, not a redundant API call. Fixed the test mock that had
encoded the same bug (get: () => null -> undefined).
(c) Route the 4 conversation search tools through redactConversationListContent
so REDACT_MESSAGE_CONTENT (now an opt-in context-saver, not a security
boundary) consistently trims the preview snippet, matching detail tools.
Tests: cache falsy + readOnly-annotations assertions added. type-check/lint/
build/mcpb-validation green.
The Mailbox v2 API has no size/pageSize param (page size fixed at 25 for conversations/threads, 50 elsewhere); size is silently ignored. Tools sent size= and returned truncated data while advertising larger limits. - Add HelpScoutClient.getAllPages() page-loop helper. Safe when an endpoint returns no page block (totalPages defaults to 1) -> single page, no over-fetch. - getThreads / getThreadsV3: loop all pages so message history is complete (was silently <=25); report totalThreads + truncated instead of fake nextPage. - getConversationSummary: derive first/latest over ALL threads, not first 25. - searchInboxes: scan all inbox pages so a name match past page 1 is found. - listAllInboxes: loop pages up to limit; report real totalInboxes + truncated. - Strip the ignored size= from all conversation-search params (full search page-loop lands with the NAS-1298 rewrite). Tests rewritten to assert the real win (cross-page completeness). 389 pass; only the pre-existing package-scripts local-.env test fails.
…format) First consolidation slice. format: 'json'|'rfc822' selects the Accept header server-side. Removes the duplicate tool (102 -> 101). Updated mcp.json, extension manifest, and tests to match.
…nversations Merge advancedConversationSearch, comprehensiveConversationSearch, and structuredConversationFilter into one query-aware searchConversations. It now compiles convenience filters (contentTerms->body, subjectTerms->subject, email/emailDomain, customerIds, hasAttachments, assignedTo=-1->Unassigned) into the documented query=() syntax and passes folder/assigned_to/number/ modifiedSince as documented top-level params. Status supports all/open. Removes 3 redundant tools + their dead helpers (searchSingleStatus, formatComprehensiveSearchResults, etc.) and 3 input schemas. The 4-search-tool surface was the #1 agent wrong-tool-selection trap (navigator plugin shipped DANGER docs to disambiguate them). 98 tools (was 101). Tests repointed to searchConversations + new focused tests asserting the compiled query syntax. type-check/lint/build green; 370 pass.
…cape query terms Reports: getCompanyReport, getConversationsReport, getProductivityReport, getUserReport, getHappinessReport, getChannelReport(channel), getDocsReport. Each routes by a report/channel discriminator to the documented /reports/* path, forwarding only the params that path documents (start/end/previous*/mailboxes/ tags/types/folders + per-report viewBy/officeHours/page/rows/range/sort). Removes 25 tools + their schemas/handlers/cases. Also fixes a MEDIUM query-injection flagged by security review: searchConversations now escapes backslash/quote in contentTerms/subjectTerms/email/emailDomain before interpolating into the query=() syntax (customerIds are zod-enforced ints; raw query is a documented power-user passthrough). 73 tools (was 98). type-check/lint/build green; 375 pass.
…stomerContacts getCustomerContacts already fetches address/emails/phones/chats/social-profiles/ websites in parallel (strict superset), so getCustomerAddress + the 5 listCustomer* tools were redundant. Removed them + schemas/cases; repointed tests to getCustomerContacts (no data access lost). 67 tools (was 73). All green.
- getConversationV3/getThreadsV3 -> getConversation/getThreads with an intent-named includeSystemActors flag (routes to v3 when true). Drops the leaky preserveSystemUsers concept flagged by the multi-model review. - listCustomersV3 -> listCustomers with useV3/cursor (keeps both v2 page and v3 cursor pagination; v3-only email/createdSince preserved). - searchInboxes -> listAllInboxes(nameContains) (deprecated tool removed). 63 tools (was 67). type-check/lint/build green; 376 pass.
getInbox gains include: ('fields'|'folders'|'routing')[] and fans out server-side
(Promise.allSettled, per-sub-resource includeErrors). One call returns the inbox
plus its custom fields / folders / routing. Removes listInboxCustomFields,
listInboxFolders, getInboxRouting. 60 tools (was 63). All green.
… into parents
- getUser/listUsers: includeStatus/includeStatuses (fetch /users/{id}/status and
/users/status) + includeSystemActors (v3 /system-users). Removes getUserStatus,
listUserStatuses, listSystemUsers, getSystemUser.
- getDocsSite: includeRestrictions (fetch /sites/{id}/restricted, secret-redacted).
Removes getDocsSiteRestrictions.
55 tools (was 60). Consolidation complete: 102 -> 55 (-46%). All green.
…nputSchema Code review caught a lost-capability regression: the merged searchConversations supported contentTerms/subjectTerms/email/emailDomain/customerIds/hasAttachments/ folderId/assignedTo/conversationNumber/modifiedSince in its Zod schema + handler, but the *advertised* inputSchema only listed the original params — so LLM clients (which build calls from inputSchema, not Zod) couldn't discover them, defeating the 4->1 merge. Added all 10 to the inputSchema, fixed the status enum (adds all/open) and sort enum, switched page/limit to integer. Also strip a leading @ from emailDomain. Regression test added.
…olidation v1.9.0: tool-surface consolidation (102→55) + read-API hardening
…ol surface The consolidation updated the jest unit tests but not the live CI harnesses (dogfood:mcp, dogfood:workflows, test:forensic) which npm test doesn't cover — they still named the 47 removed tools, failing CI. - mcp-client-dogfood.ts: EXPECTED_TOOLS -> 55; repointed all per-tool scenarios. - integration-workflows.ts: repointed search/inbox scenarios to searchConversations / listAllInboxes(nameContains); scenario 4 searches body OR subject (the seeded term is in the subject); scenario 12 asserts results.length. - test-all-tools-edge-cases.ts: repointed 16 test() calls; updated 3 validation tests whose rejection behavior no longer exists (structuredConversationFilter unique-field requirement, searchInboxes query-required) to expect success; quote-injection test moved onto searchConversations' escaping. - prompts/index.ts: prompt copy points to merged tools. Verified live: dogfood:full 20/20 + discovery, test:forensic 78/78, jest 384.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
help-scout-mcp-server@1.9.0and refresh stale 17-tool guidance.form-data.Testing
npm run type-checknpm run lintnpm run buildnpm test -- --runInBand --silentnpm pack --dry-runnpm run mcpb:packnpm run test:contractnpm run test:docker:cinpm run test:dockernpm run dogfood:seednpm run dogfood:fullnpm audit --omit=devnpm run securitynpm run security:fullNo tag, npm publish, Docker publish, or GitHub release has been cut from this branch.
Closes NAS-1297