160 lines
7.9 KiB
Markdown
160 lines
7.9 KiB
Markdown
# Spec Delta: MCP Member Tools for Organization Support
|
|||
|
|
|
||
|
|
## MODIFIED Requirements
|
||
|
|
|
||
|
|
### Requirement: Create Member Tool
|
||
|
|
The MCP server SHALL provide a `create_member` tool that creates both individual and organization members via the GraphQL API.
|
||
|
|
|
||
|
|
#### Scenario: Create individual member with first name
|
||
|
|
- **GIVEN** memberType is "INDIVIDUAL" or not specified
|
||
|
|
- **WHEN** the `create_member` tool is invoked with firstName="Alice"
|
||
|
|
- **THEN** the tool SHALL create a new individual member with firstName="Alice"
|
||
|
|
- **AND** return the created member with generated ID and memberType="INDIVIDUAL"
|
||
|
|
|
||
|
|
#### Scenario: Create organization member with company name
|
||
|
|
- **GIVEN** memberType is "ORGANIZATION"
|
||
|
|
- **WHEN** the `create_member` tool is invoked with memberType="ORGANIZATION" and companyName="Acme Corp"
|
||
|
|
- **THEN** the tool SHALL create a new organization member with companyName="Acme Corp"
|
||
|
|
- **AND** return the created member with generated ID and memberType="ORGANIZATION"
|
||
|
|
|
||
|
|
#### Scenario: Create organization with contact person
|
||
|
|
- **GIVEN** memberType is "ORGANIZATION"
|
||
|
|
- **WHEN** the `create_member` tool is invoked with memberType="ORGANIZATION", companyName="Tech Inc", and firstName="Jane"
|
||
|
|
- **THEN** the tool SHALL create an organization member with both company name and contact person
|
||
|
|
- **AND** return the created member with all fields populated
|
||
|
|
|
||
|
|
#### Scenario: Create individual without firstName
|
||
|
|
- **GIVEN** memberType is "INDIVIDUAL" or not specified
|
||
|
|
- **WHEN** the `create_member` tool is invoked without firstName
|
||
|
|
- **THEN** the tool SHALL return a validation error indicating firstName is required for individual members
|
||
|
|
|
||
|
|
#### Scenario: Create organization without companyName
|
||
|
|
- **GIVEN** memberType is "ORGANIZATION"
|
||
|
|
- **WHEN** the `create_member` tool is invoked without companyName
|
||
|
|
- **THEN** the tool SHALL return a validation error indicating companyName is required for organization members
|
||
|
|
|
||
|
|
### Requirement: Update Member Tool
|
||
|
|
The MCP server SHALL provide an `update_member` tool that updates existing member information including member type transitions.
|
||
|
|
|
||
|
|
#### Scenario: Update member type from individual to organization
|
||
|
|
- **GIVEN** a member exists with ID 1 as type INDIVIDUAL
|
||
|
|
- **WHEN** the `update_member` tool is invoked with id=1, memberType="ORGANIZATION", and companyName="New Corp"
|
||
|
|
- **THEN** the tool SHALL update the member to type ORGANIZATION
|
||
|
|
- **AND** return the updated member with memberType="ORGANIZATION" and companyName="New Corp"
|
||
|
|
|
||
|
|
#### Scenario: Update organization company name
|
||
|
|
- **GIVEN** a member exists with ID 2 as type ORGANIZATION with companyName="Old Corp"
|
||
|
|
- **WHEN** the `update_member` tool is invoked with id=2 and companyName="Updated Corp"
|
||
|
|
- **THEN** the tool SHALL update the company name
|
||
|
|
- **AND** return the updated member with companyName="Updated Corp"
|
||
|
|
|
||
|
|
#### Scenario: Update individual to organization without companyName
|
||
|
|
- **GIVEN** a member exists with ID 1 as type INDIVIDUAL
|
||
|
|
- **WHEN** the `update_member` tool is invoked with id=1 and memberType="ORGANIZATION" but no companyName
|
||
|
|
- **THEN** the tool SHALL return a validation error indicating companyName is required for organization members
|
||
|
|
|
||
|
|
### Requirement: List Members Tool Output
|
||
|
|
The `list_members` tool SHALL return member data including memberType and companyName fields.
|
||
|
|
|
||
|
|
#### Scenario: List members with mixed types
|
||
|
|
- **GIVEN** the database contains 2 individual members and 1 organization member
|
||
|
|
- **WHEN** the `list_members` tool is invoked
|
||
|
|
- **THEN** the tool SHALL return all 3 members
|
||
|
|
- **AND** each member SHALL include memberType field
|
||
|
|
- **AND** organization members SHALL include companyName field
|
||
|
|
- **AND** formatting SHALL distinguish between individuals and organizations
|
||
|
|
|
||
|
|
### Requirement: Get Member Tool Output
|
||
|
|
The `get_member` tool SHALL return member data including memberType and companyName fields.
|
||
|
|
|
||
|
|
#### Scenario: Get individual member by ID
|
||
|
|
- **GIVEN** a member exists with ID 1 as type INDIVIDUAL
|
||
|
|
- **WHEN** the `get_member` tool is invoked with id=1
|
||
|
|
- **THEN** the tool SHALL return the member with memberType="INDIVIDUAL"
|
||
|
|
- **AND** format the output showing "Type: Individual" and "Name: firstName lastName"
|
||
|
|
|
||
|
|
#### Scenario: Get organization member by ID
|
||
|
|
- **GIVEN** a member exists with ID 2 as type ORGANIZATION with companyName="Acme Corp"
|
||
|
|
- **WHEN** the `get_member` tool is invoked with id=2
|
||
|
|
- **THEN** the tool SHALL return the member with memberType="ORGANIZATION" and companyName="Acme Corp"
|
||
|
|
- **AND** format the output showing "Type: Organization" and "Company: Acme Corp"
|
||
|
|
|
||
|
|
### Requirement: Member Formatting
|
||
|
|
The MCP server SHALL format member output differently based on member type.
|
||
|
|
|
||
|
|
#### Scenario: Format individual member
|
||
|
|
- **GIVEN** a member object with memberType="INDIVIDUAL", firstName="John", lastName="Doe"
|
||
|
|
- **WHEN** the formatMember function is called
|
||
|
|
- **THEN** the output SHALL include "Type: Individual"
|
||
|
|
- **AND** the output SHALL include "Name: John Doe"
|
||
|
|
|
||
|
|
#### Scenario: Format organization member
|
||
|
|
- **GIVEN** a member object with memberType="ORGANIZATION", companyName="Tech Corp"
|
||
|
|
- **WHEN** the formatMember function is called
|
||
|
|
- **THEN** the output SHALL include "Type: Organization"
|
||
|
|
- **AND** the output SHALL include "Company: Tech Corp"
|
||
|
|
|
||
|
|
#### Scenario: Format organization with contact person
|
||
|
|
- **GIVEN** a member object with memberType="ORGANIZATION", companyName="Tech Corp", firstName="Jane", lastName="Smith"
|
||
|
|
- **WHEN** the formatMember function is called
|
||
|
|
- **THEN** the output SHALL include "Type: Organization"
|
||
|
|
- **AND** the output SHALL include "Company: Tech Corp"
|
||
|
|
- **AND** the output SHALL include "Contact Person: Jane Smith"
|
||
|
|
|
||
|
|
#### Scenario: Format member with missing memberType
|
||
|
|
- **GIVEN** a member object without memberType field (legacy data)
|
||
|
|
- **WHEN** the formatMember function is called
|
||
|
|
- **THEN** the function SHALL default to treating it as INDIVIDUAL
|
||
|
|
- **AND** format the output using individual member format
|
||
|
|
|
||
|
|
## ADDED Requirements
|
||
|
|
|
||
|
|
### Requirement: Tool Input Schema for Member Type
|
||
|
|
The `create_member` and `update_member` tools SHALL accept memberType and companyName in their input schemas.
|
||
|
|
|
||
|
|
#### Scenario: Tool accepts memberType enum values
|
||
|
|
- **GIVEN** the create_member tool definition
|
||
|
|
- **WHEN** inspecting the input schema
|
||
|
|
- **THEN** memberType SHALL be defined as an enum with values "INDIVIDUAL" and "ORGANIZATION"
|
||
|
|
- **AND** memberType SHALL be optional with default value "INDIVIDUAL"
|
||
|
|
|
||
|
|
#### Scenario: Tool accepts companyName field
|
||
|
|
- **GIVEN** the create_member tool definition
|
||
|
|
- **WHEN** inspecting the input schema
|
||
|
|
- **THEN** companyName SHALL be defined as a string type
|
||
|
|
- **AND** companyName SHALL be optional
|
||
|
|
- **AND** the description SHALL indicate it's required for ORGANIZATION members
|
||
|
|
|
||
|
|
#### Scenario: firstName is optional in schema
|
||
|
|
- **GIVEN** the create_member tool definition
|
||
|
|
- **WHEN** inspecting the input schema
|
||
|
|
- **THEN** firstName SHALL NOT be in the required array
|
||
|
|
- **AND** the description SHALL indicate it's required for INDIVIDUAL members
|
||
|
|
|
||
|
|
### Requirement: GraphQL Query Completeness
|
||
|
|
All GraphQL queries and mutations in the MCP server SHALL include memberType and companyName fields.
|
||
|
|
|
||
|
|
#### Scenario: listMembers query includes new fields
|
||
|
|
- **GIVEN** the listMembers GraphQL query
|
||
|
|
- **WHEN** the query is executed
|
||
|
|
- **THEN** the query SHALL request memberType field
|
||
|
|
- **AND** the query SHALL request companyName field
|
||
|
|
|
||
|
|
#### Scenario: getMember query includes new fields
|
||
|
|
- **GIVEN** the getMember GraphQL query
|
||
|
|
- **WHEN** the query is executed
|
||
|
|
- **THEN** the query SHALL request memberType field
|
||
|
|
- **AND** the query SHALL request companyName field
|
||
|
|
|
||
|
|
#### Scenario: createMember mutation includes new fields in response
|
||
|
|
- **GIVEN** the createMember mutation
|
||
|
|
- **WHEN** the mutation is executed
|
||
|
|
- **THEN** the mutation SHALL request memberType in the response
|
||
|
|
- **AND** the mutation SHALL request companyName in the response
|
||
|
|
|
||
|
|
#### Scenario: updateMember mutation includes new fields in response
|
||
|
|
- **GIVEN** the updateMember mutation
|
||
|
|
- **WHEN** the mutation is executed
|
||
|
|
- **THEN** the mutation SHALL request memberType in the response
|
||
|
|
- **AND** the mutation SHALL request companyName in the response
|