create_project_field
Add custom fields to GitHub projects to track specific data types like text, numbers, dates, or selections for better organization and workflow management.
Instructions
Create a custom field for a GitHub project
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | ||
| name | Yes | ||
| type | Yes | ||
| options | No | ||
| description | No | ||
| required | No |
Input Schema (JSON Schema)
{
"properties": {
"description": {
"type": "string"
},
"name": {
"type": "string"
},
"options": {
"items": {
"properties": {
"color": {
"type": "string"
},
"description": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"type": "array"
},
"projectId": {
"type": "string"
},
"required": {
"type": "boolean"
},
"type": {
"enum": [
"text",
"number",
"date",
"single_select",
"iteration",
"milestone",
"assignees",
"labels"
]
}
},
"required": [
"projectId",
"name",
"type"
],
"type": "object"
}
Implementation Reference
- Core handler function that executes the GitHub GraphQL 'createProjectV2Field' mutation to create a custom field in a project. Matches the tool arguments perfectly (projectId, name, type, options, etc.).async createField(projectId: ProjectId, field: Omit<CustomField, "id">): Promise<CustomField> { const mutation = ` mutation($input: CreateProjectV2FieldInput!) { createProjectV2Field(input: $input) { projectV2Field { id name dataType } } } `; try { const githubFieldType = mapToGraphQLFieldType(field.type); const variables: any = { input: { projectId, dataType: githubFieldType, name: field.name, } }; if (field.type === 'single_select' && field.options && field.options.length > 0) { variables.input.singleSelectOptions = field.options.map(option => ({ name: option.name, description: option.description || null, color: option.color || null })); } if (field.type === 'iteration' && field.config) { if (field.config.iterationDuration) { variables.input.iterationDuration = field.config.iterationDuration; } if (field.config.iterationStart) { variables.input.iterationStartDate = field.config.iterationStart; } } const response = await this.graphql<CreateProjectV2FieldResponse>(mutation, variables); const createdField = response.createProjectV2Field.projectV2Field; // Since the createdField object doesn't have a dataType property, we need to fetch it const fieldDetails = await this.getField(projectId, createdField.id); return { id: createdField.id, name: createdField.name, type: fieldDetails?.type || field.type, // Use fetched type or fallback to original options: field.options || [], description: field.description, required: field.required || false, defaultValue: field.defaultValue, validation: field.validation, config: field.config }; } catch (error) { this.logger.error(`Failed to create field ${field.name} for project ${projectId}`, error); throw this.handleGraphQLError(error); } }
- Zod schema defining the input parameters and validation for the create_project_field tool.// Schema for create_project_field tool export const createProjectFieldSchema = z.object({ projectId: z.string().min(1, "Project ID is required"), name: z.string().min(1, "Field name is required"), type: z.enum([ "text", "number", "date", "single_select", "iteration", "milestone", "assignees", "labels" ]), options: z.array( z.object({ name: z.string().min(1), description: z.string().optional(), color: z.string().optional(), }) ).optional(), description: z.string().optional(), required: z.boolean().optional(), }); export type CreateProjectFieldArgs = z.infer<typeof createProjectFieldSchema>;
- src/infrastructure/tools/ToolRegistry.ts:168-171 (registration)Registration of the createProjectFieldTool in the central ToolRegistry singleton.// Register project field tools this.registerTool(createProjectFieldTool); this.registerTool(listProjectFieldsTool); this.registerTool(updateProjectFieldTool);
- src/infrastructure/tools/ToolSchemas.ts:448-470 (registration)ToolDefinition export containing name, description, schema reference, and examples for MCP tool listing.export const createProjectFieldTool: ToolDefinition<CreateProjectFieldArgs> = { name: "create_project_field", description: "Create a custom field for a GitHub project", schema: createProjectFieldSchema as unknown as ToolSchema<CreateProjectFieldArgs>, examples: [ { name: "Create status field", description: "Create a status dropdown field for a project", args: { projectId: "PVT_kwDOLhQ7gc4AOEbH", name: "Status", type: "single_select", options: [ { name: "To Do", color: "red" }, { name: "In Progress", color: "yellow" }, { name: "Done", color: "green" } ], description: "Current status of the task", required: true } } ] };