fix: reject invalid Follow Up Boss task field projections - #2
Closed
cursor[bot] wants to merge 2 commits into
Closed
cursor[bot] wants to merge 2 commits into
cursor[bot] wants to merge 2 commits into
Conversation
Stop forwarding person and dueDateTime as GET /tasks fields values. Validate task projections locally so owned-task helpers fail before the upstream 400. Fixes FOLLOWUPBOSS-MCP-1F Co-authored-by: John Perry <john@theperry.group>
This was referenced Sep 7, 2026
Member
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.
Sentry
followupboss-mcp@585d14ee1900157ac51c524edb25299ed7dab9f7Root cause
followupboss_list_my_overdue_tasksandfollowupboss_list_my_tasks_due_todayadvertisedpersonanddueDateTimeas validfieldsprojections. Local validation accepted those names, then forwarded them to Follow Up BossGET /tasks, which returned 400Invalid field(s) in the fields parameter: person(anddueDateTime, personon the due-today helper). Sentry tagged the eventsmcp_error_expected=false/mcp_error_kind=followupboss_validation.personanddueDateTimecan still appear on task records whenfieldsis omitted; they are not accepted asfieldsquery values.Code path verified
followupboss_mcp.mcp_registration.followupboss_list_my_overdue_tasksfollowupboss_mcp.mcp_tools.FollowUpBossToolAdapter._list_my_tasks_by_duefollowupboss_mcp.services.tasks.TasksService.list_tasksfollowupboss_mcp.models.tasks.TaskListRequest/TaskProjectionFieldFix summary
personanddueDateTimefrom the public task projection enum.fieldslocally onTaskListRequestand owned-task helper input, with guidance to usepersonId/dueDate.personanddueDateTimeonTaskRecordresponse models.Fixes FOLLOWUPBOSS-MCP-1F
Tests / checks run
uv run pytest -x tests/mcp/test_mcp_tools_server_cli.py::test_task_list_request_rejects_unsupported_projection_with_guidance tests/mcp/test_mcp_tools_server_cli.py::test_list_my_overdue_tasks_rejects_invalid_projection_fields_locally tests/mcp/test_mcp_tools_server_cli.py::test_task_and_call_tools_publish_documented_field_enumsuv run pytest -x tests/mcp/test_mcp_tools_server_cli.py::test_tool_adapter_success_and_failure_paths tests/unit/test_battle_test_ai.py::test_read_only_tool_specs_constrain_owned_task_fields tests/unit/test_services.py::test_tasks_service tests/unit/test_datetimes.pyuv run ruff format --check .uv run ruff check .uv run mypy src testsResidual risk
Follow Up Boss does not document the full
GET /tasksfieldsallowlist. Other currently advertised projection names could still be rejected upstream. If that happens, extend_TASK_PROJECTION_FIELDSthe same way. Clients that previously requestedpersonordueDateTimewill now get a local validation error instead of an upstream 400; omitfieldsto receive the full task record.