[MOAR][Ticktick] Moar ticktick toolkit (#646)
Co-authored-by: Francisco Liberal <francisco@arcade.dev>
This commit is contained in:
parent
9fba6e6e91
commit
152806e9d2
22 changed files with 3199 additions and 1 deletions
|
|
@ -4,6 +4,7 @@ arcade-brightdata
|
|||
arcade-calendly-api
|
||||
arcade-cursor-agents-api
|
||||
arcade-datadog-api
|
||||
arcade-engine-api
|
||||
arcade-figma-api
|
||||
arcade-freshservice-api
|
||||
arcade-linkedin
|
||||
|
|
@ -12,6 +13,7 @@ arcade-miro-api
|
|||
arcade-slack-api
|
||||
arcade-stripe-api
|
||||
arcade-squareup-api
|
||||
arcade-ticktick-api
|
||||
arcade-xero-api
|
||||
arcade-zendesk
|
||||
arcade-zoho-books-api
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
files: ^.*/engine_api/.*
|
||||
files: ^.*/arcade_engine_api/.*
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: "v4.4.0"
|
||||
|
|
|
|||
18
toolkits/ticktick_api/.pre-commit-config.yaml
Normal file
18
toolkits/ticktick_api/.pre-commit-config.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
files: ^.*/ticktick_api/.*
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: "v4.4.0"
|
||||
hooks:
|
||||
- id: check-case-conflict
|
||||
- id: check-merge-conflict
|
||||
- id: check-toml
|
||||
- id: check-yaml
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.6.7
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix]
|
||||
- id: ruff-format
|
||||
44
toolkits/ticktick_api/.ruff.toml
Normal file
44
toolkits/ticktick_api/.ruff.toml
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
target-version = "py310"
|
||||
line-length = 100
|
||||
fix = true
|
||||
|
||||
[lint]
|
||||
select = [
|
||||
# flake8-2020
|
||||
"YTT",
|
||||
# flake8-bandit
|
||||
"S",
|
||||
# flake8-bugbear
|
||||
"B",
|
||||
# flake8-builtins
|
||||
"A",
|
||||
# flake8-comprehensions
|
||||
"C4",
|
||||
# flake8-debugger
|
||||
"T10",
|
||||
# flake8-simplify
|
||||
"SIM",
|
||||
# isort
|
||||
"I",
|
||||
# mccabe
|
||||
"C90",
|
||||
# pycodestyle
|
||||
"E", "W",
|
||||
# pyflakes
|
||||
"F",
|
||||
# pygrep-hooks
|
||||
"PGH",
|
||||
# pyupgrade
|
||||
"UP",
|
||||
# ruff
|
||||
"RUF",
|
||||
# tryceratops
|
||||
"TRY",
|
||||
]
|
||||
|
||||
[lint.per-file-ignores]
|
||||
"**/tests/*" = ["S101"]
|
||||
|
||||
[format]
|
||||
preview = true
|
||||
skip-magic-trailing-comma = false
|
||||
21
toolkits/ticktick_api/LICENSE
Normal file
21
toolkits/ticktick_api/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2025, Arcade AI
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
54
toolkits/ticktick_api/Makefile
Normal file
54
toolkits/ticktick_api/Makefile
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
.PHONY: help
|
||||
|
||||
help:
|
||||
@echo "🛠️ github Commands:\n"
|
||||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
|
||||
|
||||
.PHONY: install
|
||||
install: ## Install the uv environment and install all packages with dependencies
|
||||
@echo "🚀 Creating virtual environment and installing all packages using uv"
|
||||
@uv sync --active --all-extras --no-sources
|
||||
@if [ -f .pre-commit-config.yaml ]; then uv run --no-sources pre-commit install; fi
|
||||
@echo "✅ All packages and dependencies installed via uv"
|
||||
|
||||
.PHONY: install-local
|
||||
install-local: ## Install the uv environment and install all packages with dependencies with local Arcade sources
|
||||
@echo "🚀 Creating virtual environment and installing all packages using uv"
|
||||
@uv sync --active --all-extras
|
||||
@if [ -f .pre-commit-config.yaml ]; then uv run pre-commit install; fi
|
||||
@echo "✅ All packages and dependencies installed via uv"
|
||||
.PHONY: build
|
||||
build: clean-build ## Build wheel file using poetry
|
||||
@echo "🚀 Creating wheel file"
|
||||
uv build
|
||||
|
||||
.PHONY: clean-build
|
||||
clean-build: ## clean build artifacts
|
||||
@echo "🗑️ Cleaning dist directory"
|
||||
rm -rf dist
|
||||
|
||||
.PHONY: test
|
||||
test: ## Test the code with pytest
|
||||
@echo "🚀 Testing code: Running pytest"
|
||||
@uv run --no-sources pytest -W ignore -v --cov --cov-config=pyproject.toml --cov-report=xml
|
||||
|
||||
.PHONY: coverage
|
||||
coverage: ## Generate coverage report
|
||||
@echo "coverage report"
|
||||
@uv run --no-sources coverage report
|
||||
@echo "Generating coverage report"
|
||||
@uv run --no-sources coverage html
|
||||
|
||||
.PHONY: bump-version
|
||||
bump-version: ## Bump the version in the pyproject.toml file by a patch version
|
||||
@echo "🚀 Bumping version in pyproject.toml"
|
||||
uv version --no-sources --bump patch
|
||||
|
||||
.PHONY: check
|
||||
check: ## Run code quality tools.
|
||||
@if [ -f .pre-commit-config.yaml ]; then\
|
||||
echo "🚀 Linting code: Running pre-commit";\
|
||||
uv run --no-sources pre-commit run -a;\
|
||||
fi
|
||||
@echo "🚀 Static type checking: Running mypy"
|
||||
@uv run --no-sources mypy --config-file=pyproject.toml
|
||||
0
toolkits/ticktick_api/arcade_ticktick_api/__init__.py
Normal file
0
toolkits/ticktick_api/arcade_ticktick_api/__init__.py
Normal file
699
toolkits/ticktick_api/arcade_ticktick_api/tools/__init__.py
Normal file
699
toolkits/ticktick_api/arcade_ticktick_api/tools/__init__.py
Normal file
|
|
@ -0,0 +1,699 @@
|
|||
"""Arcade Starter Tools for Ticktick
|
||||
|
||||
DO NOT EDIT THIS MODULE DIRECTLY.
|
||||
|
||||
THIS MODULE WAS AUTO-GENERATED BY TRANSPILING THE API STARTER TOOL JSON DEFINITIONS
|
||||
IN THE ../wrapper_tools DIRECTORY INTO PYTHON CODE. ANY CHANGES TO THIS MODULE WILL
|
||||
BE OVERWRITTEN BY THE TRANSPILER.
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
from enum import Enum
|
||||
from typing import Annotated, Any
|
||||
|
||||
import httpx
|
||||
import jsonschema
|
||||
from arcade_tdk import ToolContext, tool
|
||||
from arcade_tdk.auth import OAuth2
|
||||
from arcade_tdk.errors import RetryableToolError
|
||||
|
||||
from .request_body_schemas import REQUEST_BODY_SCHEMAS
|
||||
|
||||
# Retry configuration
|
||||
INITIAL_RETRY_DELAY = 0.5 # seconds
|
||||
|
||||
HTTP_CLIENT = httpx.AsyncClient(
|
||||
timeout=httpx.Timeout(60.0, connect=10.0),
|
||||
limits=httpx.Limits(max_keepalive_connections=20, max_connections=100),
|
||||
transport=httpx.AsyncHTTPTransport(retries=3),
|
||||
http2=True,
|
||||
follow_redirects=True,
|
||||
)
|
||||
|
||||
|
||||
class ToolMode(str, Enum):
|
||||
"""Mode for tools with complex request bodies."""
|
||||
|
||||
GET_REQUEST_SCHEMA = "get_request_schema"
|
||||
EXECUTE = "execute"
|
||||
|
||||
|
||||
def remove_none_values(data: dict[str, Any]) -> dict[str, Any]:
|
||||
return {k: v for k, v in data.items() if v is not None}
|
||||
|
||||
|
||||
async def make_request(
|
||||
url: str,
|
||||
method: str,
|
||||
params: dict[str, Any] | None = None,
|
||||
headers: dict[str, Any] | None = None,
|
||||
content: str | None = None,
|
||||
data: dict[str, Any] | None = None,
|
||||
auth: tuple[str, str] | None = None,
|
||||
max_retries: int = 3,
|
||||
) -> httpx.Response:
|
||||
"""Make an HTTP request with retry logic for 5xx server errors."""
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
response = await HTTP_CLIENT.request(
|
||||
url=url,
|
||||
auth=auth,
|
||||
method=method,
|
||||
params=params,
|
||||
headers=headers,
|
||||
content=content,
|
||||
)
|
||||
response.raise_for_status()
|
||||
except httpx.HTTPStatusError as e:
|
||||
# Only retry on 5xx server errors
|
||||
if e.response.status_code >= 500 and attempt < max_retries - 1:
|
||||
# Exponential backoff: 0.5s, 1s, 2s
|
||||
await asyncio.sleep(INITIAL_RETRY_DELAY * (2**attempt))
|
||||
continue
|
||||
# Re-raise for 4xx errors or if max retries reached
|
||||
raise
|
||||
except httpx.RequestError:
|
||||
# Don't retry request errors (network issues are handled by transport)
|
||||
raise
|
||||
else:
|
||||
return response
|
||||
|
||||
# This should never be reached, but satisfies type checker
|
||||
raise httpx.RequestError("Max retries exceeded") # noqa: TRY003
|
||||
|
||||
|
||||
async def make_request_with_schema_validation(
|
||||
url: str,
|
||||
method: str,
|
||||
request_data: dict[str, Any],
|
||||
schema: dict[str, Any],
|
||||
auth: tuple[str, str] | None = None,
|
||||
params: dict[str, Any] | None = None,
|
||||
headers: dict[str, Any] | None = None,
|
||||
max_retries: int = 3,
|
||||
) -> httpx.Response:
|
||||
"""Make an HTTP request with schema validation on format errors."""
|
||||
try:
|
||||
response = await make_request(
|
||||
url=url,
|
||||
auth=auth,
|
||||
method=method,
|
||||
params=params,
|
||||
headers=headers,
|
||||
content=json.dumps(request_data),
|
||||
max_retries=max_retries,
|
||||
)
|
||||
except httpx.HTTPStatusError as e:
|
||||
# Only provide schema validation for format-related errors
|
||||
if e.response.status_code in (400, 422):
|
||||
# Run validation to provide additional context
|
||||
is_valid, validation_error = validate_json_against_schema(request_data, schema)
|
||||
|
||||
api_error_details = f"API returned {e.response.status_code}: {e.response.text}"
|
||||
|
||||
if not is_valid:
|
||||
# Schema validation found issues - additional context
|
||||
additional_context = (
|
||||
f"{api_error_details}\n\n"
|
||||
f"Schema validation found the following issues:\n"
|
||||
f"{validation_error}"
|
||||
)
|
||||
else:
|
||||
# Schema validation passed - just show API error
|
||||
additional_context = api_error_details
|
||||
|
||||
raise RetryableToolError(
|
||||
message=(f"API request failed with validation error: {e.response.status_code}"),
|
||||
developer_message=api_error_details,
|
||||
additional_prompt_content=additional_context,
|
||||
) from e
|
||||
else:
|
||||
# For non-validation errors, re-raise as-is
|
||||
raise
|
||||
else:
|
||||
return response
|
||||
|
||||
|
||||
def validate_json_against_schema(
|
||||
json_data: dict[str, Any], schema: dict[str, Any]
|
||||
) -> tuple[bool, str | None]:
|
||||
"""Validate JSON data against an OpenAPI/JSON Schema.
|
||||
|
||||
This provides full JSON Schema Draft 7 validation including:
|
||||
- Required fields, types, enums
|
||||
- Pattern validation (regex)
|
||||
- Format validation (email, uuid, date-time, etc.)
|
||||
- Min/max length and values
|
||||
- oneOf, anyOf, allOf
|
||||
- And all other JSON Schema features
|
||||
|
||||
Args:
|
||||
json_data: The JSON data to validate
|
||||
schema: The JSON Schema to validate against
|
||||
|
||||
Returns:
|
||||
Tuple of (is_valid, error_messages). If valid, error_messages is None.
|
||||
If invalid, error_messages contains all validation errors.
|
||||
"""
|
||||
try:
|
||||
validator = jsonschema.Draft7Validator(
|
||||
schema, format_checker=jsonschema.Draft7Validator.FORMAT_CHECKER
|
||||
)
|
||||
# Collect ALL validation errors
|
||||
errors = list(validator.iter_errors(json_data))
|
||||
if errors:
|
||||
# Format all errors with their paths
|
||||
error_messages = []
|
||||
for error in errors:
|
||||
error_path = ".".join(str(p) for p in error.path) if error.path else "root"
|
||||
error_messages.append(f"{error.message} at {error_path}")
|
||||
# Join all errors with newlines
|
||||
return False, "\n".join(error_messages)
|
||||
else:
|
||||
return True, None
|
||||
except jsonschema.SchemaError as e:
|
||||
return False, f"Invalid schema: {e.message}"
|
||||
except Exception as e:
|
||||
return False, f"Validation error: {e!s}"
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:read"]))
|
||||
async def retrieve_task_details(
|
||||
context: ToolContext,
|
||||
project_identifier: Annotated[
|
||||
str, "The unique ID of the project containing the task to retrieve."
|
||||
],
|
||||
task_identifier: Annotated[
|
||||
str,
|
||||
"Unique identifier for the task to retrieve detailed information including subtasks and reminders.", # noqa: E501
|
||||
],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'getTaskById'."]:
|
||||
"""Retrieve detailed information for a specific task.
|
||||
|
||||
Use this tool to get detailed information about a task by providing the project ID and task ID. It returns information including subtasks, reminders, and scheduling details.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}".format( # noqa: UP032
|
||||
projectId=project_identifier, taskId=task_identifier
|
||||
),
|
||||
method="GET",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def delete_specific_task(
|
||||
context: ToolContext,
|
||||
project_id: Annotated[str, "The unique ID of the project containing the task to be deleted."],
|
||||
task_identifier_to_delete: Annotated[
|
||||
str, "The unique ID of the task to permanently delete from a project."
|
||||
],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'deleteTask'."]:
|
||||
"""Permanently delete a task using project and task IDs.
|
||||
|
||||
This tool is used to permanently remove a specific task by providing its project ID and task ID from Ticktick. Use this when you need to delete a task and ensure it is no longer available in the project.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}".format( # noqa: UP032
|
||||
projectId=project_id, taskId=task_identifier_to_delete
|
||||
),
|
||||
method="DELETE",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def create_task_ticktick(
|
||||
context: ToolContext,
|
||||
mode: Annotated[
|
||||
ToolMode,
|
||||
"Operation mode: 'get_request_schema' returns the OpenAPI spec "
|
||||
"for the request body, 'execute' performs the actual operation",
|
||||
],
|
||||
request_body: Annotated[
|
||||
str | None,
|
||||
"Stringified JSON representing the request body. Required when "
|
||||
"mode is 'execute', ignored when mode is 'get_request_schema'",
|
||||
] = None,
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'createTask'."]:
|
||||
"""Create a new task in Ticktick with specified properties.
|
||||
|
||||
Use this tool to create a new task in Ticktick by specifying title, content, dates, reminders, subtasks, and the project it belongs to.
|
||||
|
||||
Note: Understanding the request schema is necessary to properly create
|
||||
the stringified JSON input object for execution.
|
||||
|
||||
Modes:
|
||||
- GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't
|
||||
already have it. Do NOT call repeatedly if you already received
|
||||
the schema.
|
||||
- EXECUTE: Performs the operation with the provided request body
|
||||
JSON.
|
||||
|
||||
If you need the schema, call with mode='get_request_schema' ONCE, then execute.
|
||||
""" # noqa: E501
|
||||
if mode == ToolMode.GET_REQUEST_SCHEMA:
|
||||
return {
|
||||
"request_body_schema": REQUEST_BODY_SCHEMAS["CREATETASKTICKTICK"],
|
||||
"instructions": (
|
||||
"Use the request_body_schema to construct a valid JSON object. "
|
||||
"Once you have populated the object following the schema "
|
||||
"structure and requirements, call this tool again with "
|
||||
"mode='execute' and the stringified JSON as the "
|
||||
"request_body parameter. "
|
||||
"Do NOT call the schema mode again - you already have "
|
||||
"the schema now."
|
||||
),
|
||||
}
|
||||
|
||||
# Mode is EXECUTE - validate parameters
|
||||
|
||||
# Validate request body is provided (not None or empty string)
|
||||
# Note: Empty objects like {} are allowed - schema validation will check if valid
|
||||
if request_body is None or request_body.strip() == "":
|
||||
raise RetryableToolError(
|
||||
message="Request body is required when mode is 'execute'",
|
||||
developer_message="The request_body parameter was null or empty string",
|
||||
additional_prompt_content=(
|
||||
"The request body is required to perform this operation. "
|
||||
"Use the schema below to construct a valid JSON object, "
|
||||
"then call this tool again in execute mode with the "
|
||||
"stringified JSON as the request_body parameter.\n\n"
|
||||
"Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATETASKTICKTICK"] + "\n```"
|
||||
),
|
||||
)
|
||||
|
||||
# Parse JSON
|
||||
try:
|
||||
request_data = json.loads(request_body)
|
||||
except json.JSONDecodeError as e:
|
||||
raise RetryableToolError(
|
||||
message=f"Invalid JSON in request body: {e!s}",
|
||||
developer_message=f"JSON parsing failed: {e!s}",
|
||||
additional_prompt_content=(
|
||||
f"The request body contains invalid JSON. Error: {e!s}\n\n"
|
||||
"Please provide a valid JSON string that matches the schema "
|
||||
"below, then call this tool again in execute mode.\n\n"
|
||||
"Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["CREATETASKTICKTICK"] + "\n```"
|
||||
),
|
||||
) from e
|
||||
|
||||
response = await make_request_with_schema_validation(
|
||||
url="https://api.ticktick.com/open/v1/task",
|
||||
method="POST",
|
||||
request_data=request_data,
|
||||
schema=json.loads(REQUEST_BODY_SCHEMAS["CREATETASKTICKTICK"]),
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
),
|
||||
}),
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def update_task_properties(
|
||||
context: ToolContext,
|
||||
mode: Annotated[
|
||||
ToolMode,
|
||||
"Operation mode: 'get_request_schema' returns the OpenAPI spec "
|
||||
"for the request body, 'execute' performs the actual operation",
|
||||
],
|
||||
task_identifier: Annotated[
|
||||
str | None,
|
||||
"The unique ID of the task to update in Ticktick. This is required to identify the specific task to be updated. Required when mode is 'execute', ignored when mode is 'get_request_schema'.", # noqa: E501
|
||||
] = None,
|
||||
request_body: Annotated[
|
||||
str | None,
|
||||
"Stringified JSON representing the request body. Required when "
|
||||
"mode is 'execute', ignored when mode is 'get_request_schema'",
|
||||
] = None,
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'updateTask'."]:
|
||||
"""Update a task's properties in Ticktick.
|
||||
|
||||
Use this tool to update various properties of a task in Ticktick. It requires the task ID and project ID, while other fields are optional. Ideal for modifying task details such as status, title, or due date.
|
||||
|
||||
Note: Understanding the request schema is necessary to properly create
|
||||
the stringified JSON input object for execution.\n\nThis operation also requires path parameters.
|
||||
|
||||
Modes:
|
||||
- GET_REQUEST_SCHEMA: Returns the schema. Only call if you don't
|
||||
already have it. Do NOT call repeatedly if you already received
|
||||
the schema.
|
||||
- EXECUTE: Performs the operation with the provided request body
|
||||
JSON.\n Note: You must also provide the required path parameters when executing.
|
||||
|
||||
If you need the schema, call with mode='get_request_schema' ONCE, then execute.
|
||||
""" # noqa: E501
|
||||
if mode == ToolMode.GET_REQUEST_SCHEMA:
|
||||
return {
|
||||
"request_body_schema": REQUEST_BODY_SCHEMAS["UPDATETASKPROPERTIES"],
|
||||
"instructions": (
|
||||
"Use the request_body_schema to construct a valid JSON object. "
|
||||
"Once you have populated the object following the schema "
|
||||
"structure and requirements, call this tool again with "
|
||||
"mode='execute' and the stringified JSON as the "
|
||||
"request_body parameter along with the required path parameters. "
|
||||
"Do NOT call the schema mode again - you already have "
|
||||
"the schema now."
|
||||
),
|
||||
}
|
||||
|
||||
# Mode is EXECUTE - validate parameters
|
||||
# Validate required parameters
|
||||
missing_params = []
|
||||
if not task_identifier:
|
||||
missing_params.append(("task_identifier", "path"))
|
||||
|
||||
if missing_params:
|
||||
param_names = [p[0] for p in missing_params]
|
||||
param_details = ", ".join([f"{p[0]} ({p[1]})" for p in missing_params])
|
||||
raise RetryableToolError(
|
||||
message=f"Missing required parameters: {param_names}",
|
||||
developer_message=(f"Required parameters validation failed: {param_details}"),
|
||||
additional_prompt_content=(
|
||||
f"The following required parameters are missing: "
|
||||
f"{param_details}. Please call this tool again with all "
|
||||
"required parameters."
|
||||
),
|
||||
)
|
||||
|
||||
# Validate request body is provided (not None or empty string)
|
||||
# Note: Empty objects like {} are allowed - schema validation will check if valid
|
||||
if request_body is None or request_body.strip() == "":
|
||||
raise RetryableToolError(
|
||||
message="Request body is required when mode is 'execute'",
|
||||
developer_message="The request_body parameter was null or empty string",
|
||||
additional_prompt_content=(
|
||||
"The request body is required to perform this operation. "
|
||||
"Use the schema below to construct a valid JSON object, "
|
||||
"then call this tool again in execute mode with the "
|
||||
"stringified JSON as the request_body parameter.\n\n"
|
||||
"Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATETASKPROPERTIES"] + "\n```"
|
||||
),
|
||||
)
|
||||
|
||||
# Parse JSON
|
||||
try:
|
||||
request_data = json.loads(request_body)
|
||||
except json.JSONDecodeError as e:
|
||||
raise RetryableToolError(
|
||||
message=f"Invalid JSON in request body: {e!s}",
|
||||
developer_message=f"JSON parsing failed: {e!s}",
|
||||
additional_prompt_content=(
|
||||
f"The request body contains invalid JSON. Error: {e!s}\n\n"
|
||||
"Please provide a valid JSON string that matches the schema "
|
||||
"below, then call this tool again in execute mode.\n\n"
|
||||
"Schema:\n\n```json\n" + REQUEST_BODY_SCHEMAS["UPDATETASKPROPERTIES"] + "\n```"
|
||||
),
|
||||
) from e
|
||||
|
||||
response = await make_request_with_schema_validation(
|
||||
url="https://api.ticktick.com/open/v1/task/{taskId}".format(taskId=task_identifier), # noqa: UP032
|
||||
method="POST",
|
||||
request_data=request_data,
|
||||
schema=json.loads(REQUEST_BODY_SCHEMAS["UPDATETASKPROPERTIES"]),
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
),
|
||||
}),
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def mark_task_complete(
|
||||
context: ToolContext,
|
||||
project_id: Annotated[str, "Unique ID of the project containing the task to be completed."],
|
||||
task_identifier: Annotated[str, "The unique ID of the task to be marked as completed."],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'completeTask'."]:
|
||||
"""Marks a specific task as completed in Ticktick.
|
||||
|
||||
Use this tool to mark a task as completed in Ticktick, updating its status and setting the completion time.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}/complete".format( # noqa: UP032
|
||||
projectId=project_id, taskId=task_identifier
|
||||
),
|
||||
method="POST",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:read"]))
|
||||
async def get_user_projects(
|
||||
context: ToolContext,
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'getUserProjects'."]:
|
||||
"""Retrieve all user-accessible projects from Ticktick.
|
||||
|
||||
This tool fetches a list of all projects that the authenticated user has access to in Ticktick. It should be called when a user wants to view or manage their projects within the platform.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project",
|
||||
method="GET",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def create_project_in_ticktick(
|
||||
context: ToolContext,
|
||||
project_name: Annotated[str, "Name of the project to be created. This is a required field."],
|
||||
project_color: Annotated[
|
||||
str | None, "Hex color code representing the project's color (e.g., '#F18181')."
|
||||
] = None,
|
||||
project_kind: Annotated[
|
||||
str | None,
|
||||
"Specifies the type of items the project will store. Choose 'TASK' for tasks or 'NOTE' for notes.", # noqa: E501
|
||||
] = None,
|
||||
project_sort_order: Annotated[
|
||||
int | None, "The integer value representing the project's sort order."
|
||||
] = None,
|
||||
project_view_mode: Annotated[
|
||||
str | None, "The display mode for the project: choose from 'list', 'kanban', or 'timeline'."
|
||||
] = None,
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'createProject'."]:
|
||||
"""Create a new project in Ticktick with optional properties.
|
||||
|
||||
Use this tool to create a new project in Ticktick. You can specify the project's name and other optional properties such as color, sort order, view mode, and kind (TASK or NOTE).""" # noqa: E501
|
||||
request_data = remove_none_values({
|
||||
"name": project_name,
|
||||
"color": project_color,
|
||||
"sortOrder": project_sort_order,
|
||||
"viewMode": project_view_mode,
|
||||
"kind": project_kind,
|
||||
})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project",
|
||||
method="POST",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
),
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:read"]))
|
||||
async def get_ticktick_project_by_id(
|
||||
context: ToolContext,
|
||||
project_id: Annotated[str, "The unique ID of the Ticktick project to retrieve."],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'getProjectById'."]:
|
||||
"""Retrieve Ticktick project details by project ID.
|
||||
|
||||
This tool retrieves detailed information about a specific project in Ticktick using its ID. It provides the project's name, color, view mode, and kind.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}".format(projectId=project_id), # noqa: UP032
|
||||
method="GET",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def update_project_properties(
|
||||
context: ToolContext,
|
||||
project_identifier: Annotated[str, "Unique ID of the project to update."],
|
||||
project_color: Annotated[
|
||||
str | None, "Hex color code representing the color of the project, such as '#FFFFFF'."
|
||||
] = None,
|
||||
project_kind: Annotated[str | None, "Specify the type of project: TASK or NOTE."] = None,
|
||||
project_name: Annotated[
|
||||
str | None,
|
||||
"The new name for the project to be updated. This should be a string representing the desired project name.", # noqa: E501
|
||||
] = None,
|
||||
project_sort_order: Annotated[
|
||||
int | None,
|
||||
"Sort order value for the project, default is 0. Determines the project's position relative to others.", # noqa: E501
|
||||
] = None,
|
||||
project_view_mode: Annotated[
|
||||
str | None,
|
||||
"Specifies the view mode of the project. Options are 'list', 'kanban', or 'timeline'.",
|
||||
] = None,
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'updateProject'."]:
|
||||
"""Update properties of an existing project.
|
||||
|
||||
This tool updates various properties of an existing project, such as name, color, sort order, view mode, and kind. It should be used when changes to these attributes are needed for a project on Ticktick.""" # noqa: E501
|
||||
request_data = remove_none_values({
|
||||
"name": project_name,
|
||||
"color": project_color,
|
||||
"sortOrder": project_sort_order,
|
||||
"viewMode": project_view_mode,
|
||||
"kind": project_kind,
|
||||
})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}".format( # noqa: UP032
|
||||
projectId=project_identifier
|
||||
),
|
||||
method="POST",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
),
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:write"]))
|
||||
async def delete_ticktick_project(
|
||||
context: ToolContext,
|
||||
project_id: Annotated[
|
||||
str,
|
||||
"The unique ID of the Ticktick project to permanently delete. Ensure the ID is correct, as this action cannot be undone.", # noqa: E501
|
||||
],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'deleteProject'."]:
|
||||
"""Permanently delete a project in Ticktick by ID.
|
||||
|
||||
Use this tool to permanently remove a specific project and all associated tasks from Ticktick by providing the project's ID. Ensure you no longer need the project, as this action cannot be undone.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}".format(projectId=project_id), # noqa: UP032
|
||||
method="DELETE",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
||||
|
||||
@tool(requires_auth=OAuth2(id="arcade-ticktick", scopes=["tasks:read"]))
|
||||
async def retrieve_project_with_tasks(
|
||||
context: ToolContext,
|
||||
project_id: Annotated[
|
||||
str, "The unique ID of the project to retrieve with all data, including tasks and columns."
|
||||
],
|
||||
) -> Annotated[dict[str, Any], "Response from the API endpoint 'getProjectWithData'."]:
|
||||
"""Retrieve detailed project information and all related tasks.
|
||||
|
||||
Call this tool to get a complete view of a project, including tasks and column configurations, especially useful for understanding project status and organization.""" # noqa: E501
|
||||
request_data = remove_none_values({})
|
||||
content = json.dumps(request_data) if request_data else None
|
||||
response = await make_request(
|
||||
url="https://api.ticktick.com/open/v1/project/{projectId}/data".format( # noqa: UP032
|
||||
projectId=project_id
|
||||
),
|
||||
method="GET",
|
||||
params=remove_none_values({}),
|
||||
headers=remove_none_values({
|
||||
"Authorization": "Bearer {authorization}".format( # noqa: UP032
|
||||
authorization=context.get_auth_token_or_empty()
|
||||
)
|
||||
}),
|
||||
content=content,
|
||||
)
|
||||
try:
|
||||
return {"response_json": response.json()}
|
||||
except Exception:
|
||||
return {"response_text": response.text}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
"""Request Body Schemas for API Tools
|
||||
|
||||
DO NOT EDIT THIS MODULE DIRECTLY.
|
||||
|
||||
THIS MODULE WAS AUTO-GENERATED AND CONTAINS OpenAPI REQUEST BODY SCHEMAS
|
||||
FOR TOOLS WITH COMPLEX REQUEST BODIES. ANY CHANGES TO THIS MODULE WILL
|
||||
BE OVERWRITTEN BY THE TRANSPILER.
|
||||
"""
|
||||
|
||||
from typing import Any
|
||||
|
||||
REQUEST_BODY_SCHEMAS: dict[str, Any] = {
|
||||
"CREATETASKTICKTICK": '{"type": "object", "description": "Input schema for creating a new task", "properties": {"title": {"type": "string", "description": "Task title - the name or summary of the task (required)"}, "projectId": {"type": "string", "description": "Project id - the project where this task will be created (required)"}, "content": {"type": "string", "description": "Task content - additional details or description"}, "desc": {"type": "string", "description": "Description of checklist - detailed description for checklist tasks"}, "isAllDay": {"type": "boolean", "description": "All day flag - set to true for all-day tasks"}, "startDate": {"type": "string", "format": "date-time", "description": "Start date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}, "dueDate": {"type": "string", "format": "date-time", "description": "Due date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}, "timeZone": {"type": "string", "description": "The time zone in which the time is specified", "example": "America/Los_Angeles"}, "reminders": {"type": "array", "items": {"type": "string"}, "description": "Lists of reminders specific to the task"}, "repeatFlag": {"type": "string", "description": "Recurring rules of task in RRULE format"}, "priority": {"type": "integer", "description": "The priority of task - default is 0 (None: 0, Low: 1, Medium: 3, High: 5)", "default": 0}, "sortOrder": {"type": "integer", "format": "int64", "description": "The order of task"}, "items": {"type": "array", "items": {"type": "object", "description": "Input schema for creating or updating a checklist item", "properties": {"title": {"type": "string", "description": "Subtask title"}, "startDate": {"type": "string", "format": "date-time", "description": "Start date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format"}, "isAllDay": {"type": "boolean", "description": "All day flag"}, "sortOrder": {"type": "integer", "format": "int64", "description": "The order of subtask"}, "timeZone": {"type": "string", "description": "The time zone in which the Start time is specified"}, "status": {"type": "integer", "format": "int32", "description": "The completion status of subtask - Normal: 0, Completed: 1"}, "completedTime": {"type": "string", "format": "date-time", "description": "Completed time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}}}, "description": "The list of subtasks"}}, "required": ["title", "projectId"]}', # noqa: E501
|
||||
"UPDATETASKPROPERTIES": '{"type": "object", "description": "Input schema for updating an existing task", "properties": {"id": {"type": "string", "description": "Task id - must match the task being updated (required)"}, "projectId": {"type": "string", "description": "Project id - must match the project containing the task (required)"}, "title": {"type": "string", "description": "Task title"}, "content": {"type": "string", "description": "Task content"}, "desc": {"type": "string", "description": "Description of checklist"}, "isAllDay": {"type": "boolean", "description": "All day flag"}, "startDate": {"type": "string", "format": "date-time", "description": "Start date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}, "dueDate": {"type": "string", "format": "date-time", "description": "Due date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}, "timeZone": {"type": "string", "description": "The time zone in which the time is specified"}, "reminders": {"type": "array", "items": {"type": "string"}, "description": "Lists of reminders specific to the task"}, "repeatFlag": {"type": "string", "description": "Recurring rules of task"}, "priority": {"type": "integer", "description": "The priority of task (None: 0, Low: 1, Medium: 3, High: 5)"}, "sortOrder": {"type": "integer", "format": "int64", "description": "The order of task"}, "items": {"type": "array", "items": {"type": "object", "description": "Input schema for creating or updating a checklist item", "properties": {"title": {"type": "string", "description": "Subtask title"}, "startDate": {"type": "string", "format": "date-time", "description": "Start date and time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format"}, "isAllDay": {"type": "boolean", "description": "All day flag"}, "sortOrder": {"type": "integer", "format": "int64", "description": "The order of subtask"}, "timeZone": {"type": "string", "description": "The time zone in which the Start time is specified"}, "status": {"type": "integer", "format": "int32", "description": "The completion status of subtask - Normal: 0, Completed: 1"}, "completedTime": {"type": "string", "format": "date-time", "description": "Completed time in \'yyyy-MM-dd\'T\'HH:mm:ssZ\' format", "example": "2019-11-13T03:00:00+0000"}}}, "description": "The list of subtasks"}}, "required": ["id", "projectId"]}', # noqa: E501
|
||||
}
|
||||
|
|
@ -0,0 +1,255 @@
|
|||
{
|
||||
"name": "CreateProjectInTicktick",
|
||||
"fully_qualified_name": "TicktickApi.CreateProjectInTicktick@0.1.0",
|
||||
"description": "Create a new project in Ticktick with optional properties.\n\nUse this tool to create a new project in Ticktick. You can specify the project's name and other optional properties such as color, sort order, view mode, and kind (TASK or NOTE).",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_name",
|
||||
"required": true,
|
||||
"description": "Name of the project to be created. This is a required field.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Name of the project (required)"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "name"
|
||||
},
|
||||
{
|
||||
"name": "project_color",
|
||||
"required": false,
|
||||
"description": "Hex color code representing the project's color (e.g., '#F18181').",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Color of project - hex color code (e.g., '#F18181')"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "color"
|
||||
},
|
||||
{
|
||||
"name": "project_sort_order",
|
||||
"required": false,
|
||||
"description": "The integer value representing the project's sort order.",
|
||||
"value_schema": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Sort order value of the project"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "sortOrder"
|
||||
},
|
||||
{
|
||||
"name": "project_view_mode",
|
||||
"required": false,
|
||||
"description": "The display mode for the project: choose from 'list', 'kanban', or 'timeline'.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"list",
|
||||
"kanban",
|
||||
"timeline"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "View mode - how the project should be displayed (list, kanban, or timeline)"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "viewMode"
|
||||
},
|
||||
{
|
||||
"name": "project_kind",
|
||||
"required": false,
|
||||
"description": "Specifies the type of items the project will store. Choose 'TASK' for tasks or 'NOTE' for notes.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"TASK",
|
||||
"NOTE"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project kind - type of items to store (TASK or NOTE)"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "kind"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'createProject'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project",
|
||||
"http_method": "POST",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "name",
|
||||
"tool_parameter_name": "project_name",
|
||||
"description": "Name of the project (required)",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Name of the project (required)"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "color",
|
||||
"tool_parameter_name": "project_color",
|
||||
"description": "Color of project - hex color code (e.g., '#F18181')",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Color of project - hex color code (e.g., '#F18181')"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "sortOrder",
|
||||
"tool_parameter_name": "project_sort_order",
|
||||
"description": "Sort order value of the project",
|
||||
"value_schema": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Sort order value of the project"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "viewMode",
|
||||
"tool_parameter_name": "project_view_mode",
|
||||
"description": "View mode - how the project should be displayed (list, kanban, or timeline)",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"list",
|
||||
"kanban",
|
||||
"timeline"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "View mode - how the project should be displayed (list, kanban, or timeline)"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"tool_parameter_name": "project_kind",
|
||||
"description": "Project kind - type of items to store (TASK or NOTE)",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"TASK",
|
||||
"NOTE"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project kind - type of items to store (TASK or NOTE)"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": "{\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"description\": \"Input schema for creating a new project\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the project (required)\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Color of project - hex color code (e.g., '#F18181')\",\n \"example\": \"#F18181\"\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"Sort order value of the project\"\n },\n \"viewMode\": {\n \"type\": \"string\",\n \"enum\": [\n \"list\",\n \"kanban\",\n \"timeline\"\n ],\n \"description\": \"View mode - how the project should be displayed (list, kanban, or timeline)\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"enum\": [\n \"TASK\",\n \"NOTE\"\n ],\n \"description\": \"Project kind - type of items to store (TASK or NOTE)\"\n }\n },\n \"required\": [\n \"name\"\n ]\n },\n \"example\": {\n \"name\": \"project name\",\n \"color\": \"#F18181\",\n \"viewMode\": \"list\",\n \"kind\": \"task\"\n }\n }\n }\n}",
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,433 @@
|
|||
{
|
||||
"name": "CreateTaskTicktick",
|
||||
"fully_qualified_name": "TicktickApi.CreateTaskTicktick@0.1.0",
|
||||
"description": "Create a new task in Ticktick with specified properties.\n\nUse this tool to create a new task in Ticktick by specifying title, content, dates, reminders, subtasks, and the project it belongs to.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "task_details_json",
|
||||
"required": true,
|
||||
"description": "A JSON object containing task properties such as title, projectId, content, subtasks, dates, reminders, etc.",
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task title - the name or summary of the task (required)"
|
||||
},
|
||||
"projectId": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project id - the project where this task will be created (required)"
|
||||
},
|
||||
"content": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task content - additional details or description"
|
||||
},
|
||||
"desc": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Description of checklist - detailed description for checklist tasks"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag - set to true for all-day tasks"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"dueDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the time is specified"
|
||||
},
|
||||
"reminders": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "string",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Lists of reminders specific to the task"
|
||||
},
|
||||
"repeatFlag": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Recurring rules of task in RRULE format"
|
||||
},
|
||||
"priority": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The priority of task - default is 0 (None: 0, Low: 1, Medium: 3, High: 5)"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of task"
|
||||
},
|
||||
"items": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "json",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Subtask title"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of subtask"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the Start time is specified"
|
||||
},
|
||||
"status": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The completion status of subtask - Normal: 0, Completed: 1"
|
||||
},
|
||||
"completedTime": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
}
|
||||
},
|
||||
"description": "The list of subtasks"
|
||||
}
|
||||
},
|
||||
"inner_properties": null,
|
||||
"description": ""
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "requestBody"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'createTask'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/task",
|
||||
"http_method": "POST",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "requestBody",
|
||||
"tool_parameter_name": "task_details_json",
|
||||
"description": "",
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task title - the name or summary of the task (required)"
|
||||
},
|
||||
"projectId": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project id - the project where this task will be created (required)"
|
||||
},
|
||||
"content": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task content - additional details or description"
|
||||
},
|
||||
"desc": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Description of checklist - detailed description for checklist tasks"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag - set to true for all-day tasks"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"dueDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the time is specified"
|
||||
},
|
||||
"reminders": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "string",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Lists of reminders specific to the task"
|
||||
},
|
||||
"repeatFlag": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Recurring rules of task in RRULE format"
|
||||
},
|
||||
"priority": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The priority of task - default is 0 (None: 0, Low: 1, Medium: 3, High: 5)"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of task"
|
||||
},
|
||||
"items": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "json",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Subtask title"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of subtask"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the Start time is specified"
|
||||
},
|
||||
"status": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The completion status of subtask - Normal: 0, Completed: 1"
|
||||
},
|
||||
"completedTime": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
}
|
||||
},
|
||||
"description": "The list of subtasks"
|
||||
}
|
||||
},
|
||||
"inner_properties": null,
|
||||
"description": ""
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": "{\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"description\": \"Input schema for creating a new task\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Task title - the name or summary of the task (required)\"\n },\n \"projectId\": {\n \"type\": \"string\",\n \"description\": \"Project id - the project where this task will be created (required)\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Task content - additional details or description\"\n },\n \"desc\": {\n \"type\": \"string\",\n \"description\": \"Description of checklist - detailed description for checklist tasks\"\n },\n \"isAllDay\": {\n \"type\": \"boolean\",\n \"description\": \"All day flag - set to true for all-day tasks\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n },\n \"dueDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n },\n \"timeZone\": {\n \"type\": \"string\",\n \"description\": \"The time zone in which the time is specified\",\n \"example\": \"America/Los_Angeles\"\n },\n \"reminders\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Lists of reminders specific to the task\"\n },\n \"repeatFlag\": {\n \"type\": \"string\",\n \"description\": \"Recurring rules of task in RRULE format\"\n },\n \"priority\": {\n \"type\": \"integer\",\n \"description\": \"The priority of task - default is 0 (None: 0, Low: 1, Medium: 3, High: 5)\",\n \"default\": 0\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"The order of task\"\n },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"description\": \"Input schema for creating or updating a checklist item\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Subtask title\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\"\n },\n \"isAllDay\": {\n \"type\": \"boolean\",\n \"description\": \"All day flag\"\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"The order of subtask\"\n },\n \"timeZone\": {\n \"type\": \"string\",\n \"description\": \"The time zone in which the Start time is specified\"\n },\n \"status\": {\n \"type\": \"integer\",\n \"format\": \"int32\",\n \"description\": \"The completion status of subtask - Normal: 0, Completed: 1\"\n },\n \"completedTime\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n }\n }\n },\n \"description\": \"The list of subtasks\"\n }\n },\n \"required\": [\n \"title\",\n \"projectId\"\n ]\n },\n \"example\": {\n \"title\": \"Task Title\",\n \"projectId\": \"6226ff9877acee87727f6bca\",\n \"content\": \"Task Content\",\n \"isAllDay\": true,\n \"startDate\": \"2019-11-13T03:00:00+0000\",\n \"dueDate\": \"2019-11-14T03:00:00+0000\",\n \"priority\": 1\n }\n }\n }\n}",
|
||||
"use_request_body_schema_mode": true,
|
||||
"validate_request_body_schema": true
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
{
|
||||
"name": "DeleteSpecificTask",
|
||||
"fully_qualified_name": "TicktickApi.DeleteSpecificTask@0.1.0",
|
||||
"description": "Permanently delete a task using project and task IDs.\n\nThis tool is used to permanently remove a specific task by providing its project ID and task ID from Ticktick. Use this when you need to delete a task and ensure it is no longer available in the project.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_id",
|
||||
"required": true,
|
||||
"description": "The unique ID of the project containing the task to be deleted.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
},
|
||||
{
|
||||
"name": "task_identifier_to_delete",
|
||||
"required": true,
|
||||
"description": "The unique ID of the task to permanently delete from a project.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to delete"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "taskId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'deleteTask'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}",
|
||||
"http_method": "DELETE",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_id",
|
||||
"description": "Project identifier - the unique ID of the project containing the task",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "taskId",
|
||||
"tool_parameter_name": "task_identifier_to_delete",
|
||||
"description": "Task identifier - the unique ID of the task to delete",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to delete"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
{
|
||||
"name": "DeleteTicktickProject",
|
||||
"fully_qualified_name": "TicktickApi.DeleteTicktickProject@0.1.0",
|
||||
"description": "Permanently delete a project in Ticktick by ID.\n\nUse this tool to permanently remove a specific project and all associated tasks from Ticktick by providing the project's ID. Ensure you no longer need the project, as this action cannot be undone.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_id",
|
||||
"required": true,
|
||||
"description": "The unique ID of the Ticktick project to permanently delete. Ensure the ID is correct, as this action cannot be undone.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to delete"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'deleteProject'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}",
|
||||
"http_method": "DELETE",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_id",
|
||||
"description": "Project identifier - the unique ID of the project to delete",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to delete"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
{
|
||||
"name": "GetTicktickProjectById",
|
||||
"fully_qualified_name": "TicktickApi.GetTicktickProjectById@0.1.0",
|
||||
"description": "Retrieve Ticktick project details by project ID.\n\nThis tool retrieves detailed information about a specific project in Ticktick using its ID. It provides the project's name, color, view mode, and kind.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_id",
|
||||
"required": true,
|
||||
"description": "The unique ID of the Ticktick project to retrieve.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to retrieve"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'getProjectById'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:read"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}",
|
||||
"http_method": "GET",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_id",
|
||||
"description": "Project identifier - the unique ID of the project to retrieve",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to retrieve"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"name": "GetUserProjects",
|
||||
"fully_qualified_name": "TicktickApi.GetUserProjects@0.1.0",
|
||||
"description": "Retrieve all user-accessible projects from Ticktick.\n\nThis tool fetches a list of all projects that the authenticated user has access to in Ticktick. It should be called when a user wants to view or manage their projects within the platform.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": []
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'getUserProjects'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:read"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project",
|
||||
"http_method": "GET",
|
||||
"headers": {},
|
||||
"parameters": [],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
{
|
||||
"name": "MarkTaskComplete",
|
||||
"fully_qualified_name": "TicktickApi.MarkTaskComplete@0.1.0",
|
||||
"description": "Marks a specific task as completed in Ticktick.\n\nUse this tool to mark a task as completed in Ticktick, updating its status and setting the completion time.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_id",
|
||||
"required": true,
|
||||
"description": "Unique ID of the project containing the task to be completed.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
},
|
||||
{
|
||||
"name": "task_identifier",
|
||||
"required": true,
|
||||
"description": "The unique ID of the task to be marked as completed.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to complete"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "taskId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'completeTask'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}/complete",
|
||||
"http_method": "POST",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_id",
|
||||
"description": "Project identifier - the unique ID of the project containing the task",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "taskId",
|
||||
"tool_parameter_name": "task_identifier",
|
||||
"description": "Task identifier - the unique ID of the task to complete",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to complete"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
{
|
||||
"name": "RetrieveProjectWithTasks",
|
||||
"fully_qualified_name": "TicktickApi.RetrieveProjectWithTasks@0.1.0",
|
||||
"description": "Retrieve detailed project information and all related tasks.\n\nCall this tool to get a complete view of a project, including tasks and column configurations, especially useful for understanding project status and organization.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_id",
|
||||
"required": true,
|
||||
"description": "The unique ID of the project to retrieve with all data, including tasks and columns.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to retrieve with all data"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'getProjectWithData'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:read"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}/data",
|
||||
"http_method": "GET",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_id",
|
||||
"description": "Project identifier - the unique ID of the project to retrieve with all data",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to retrieve with all data"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
{
|
||||
"name": "RetrieveTaskDetails",
|
||||
"fully_qualified_name": "TicktickApi.RetrieveTaskDetails@0.1.0",
|
||||
"description": "Retrieve detailed information for a specific task.\n\nUse this tool to get detailed information about a task by providing the project ID and task ID. It returns information including subtasks, reminders, and scheduling details.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_identifier",
|
||||
"required": true,
|
||||
"description": "The unique ID of the project containing the task to retrieve.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
},
|
||||
{
|
||||
"name": "task_identifier",
|
||||
"required": true,
|
||||
"description": "Unique identifier for the task to retrieve detailed information including subtasks and reminders.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to retrieve"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "taskId"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'getTaskById'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:read"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}/task/{taskId}",
|
||||
"http_method": "GET",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_identifier",
|
||||
"description": "Project identifier - the unique ID of the project containing the task",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project containing the task"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "taskId",
|
||||
"tool_parameter_name": "task_identifier",
|
||||
"description": "Task identifier - the unique ID of the task to retrieve",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to retrieve"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": null,
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,288 @@
|
|||
{
|
||||
"name": "UpdateProjectProperties",
|
||||
"fully_qualified_name": "TicktickApi.UpdateProjectProperties@0.1.0",
|
||||
"description": "Update properties of an existing project.\n\nThis tool updates various properties of an existing project, such as name, color, sort order, view mode, and kind. It should be used when changes to these attributes are needed for a project on Ticktick.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "project_identifier",
|
||||
"required": true,
|
||||
"description": "Unique ID of the project to update.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to update"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "projectId"
|
||||
},
|
||||
{
|
||||
"name": "project_name",
|
||||
"required": false,
|
||||
"description": "The new name for the project to be updated. This should be a string representing the desired project name.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Name of the project"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "name"
|
||||
},
|
||||
{
|
||||
"name": "project_color",
|
||||
"required": false,
|
||||
"description": "Hex color code representing the color of the project, such as '#FFFFFF'.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Color of the project - hex color code"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "color"
|
||||
},
|
||||
{
|
||||
"name": "project_sort_order",
|
||||
"required": false,
|
||||
"description": "Sort order value for the project, default is 0. Determines the project's position relative to others.",
|
||||
"value_schema": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Sort order value - default 0"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "sortOrder"
|
||||
},
|
||||
{
|
||||
"name": "project_view_mode",
|
||||
"required": false,
|
||||
"description": "Specifies the view mode of the project. Options are 'list', 'kanban', or 'timeline'.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"list",
|
||||
"kanban",
|
||||
"timeline"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "View mode - how the project is displayed"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "viewMode"
|
||||
},
|
||||
{
|
||||
"name": "project_kind",
|
||||
"required": false,
|
||||
"description": "Specify the type of project: TASK or NOTE.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"TASK",
|
||||
"NOTE"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project kind - TASK or NOTE"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "kind"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'updateProject'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/project/{projectId}",
|
||||
"http_method": "POST",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "projectId",
|
||||
"tool_parameter_name": "project_identifier",
|
||||
"description": "Project identifier - the unique ID of the project to update",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project identifier - the unique ID of the project to update"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "name",
|
||||
"tool_parameter_name": "project_name",
|
||||
"description": "Name of the project",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Name of the project"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "color",
|
||||
"tool_parameter_name": "project_color",
|
||||
"description": "Color of the project - hex color code",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Color of the project - hex color code"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "sortOrder",
|
||||
"tool_parameter_name": "project_sort_order",
|
||||
"description": "Sort order value - default 0",
|
||||
"value_schema": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Sort order value - default 0"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "viewMode",
|
||||
"tool_parameter_name": "project_view_mode",
|
||||
"description": "View mode - how the project is displayed",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"list",
|
||||
"kanban",
|
||||
"timeline"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "View mode - how the project is displayed"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "kind",
|
||||
"tool_parameter_name": "project_kind",
|
||||
"description": "Project kind - TASK or NOTE",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": [
|
||||
"TASK",
|
||||
"NOTE"
|
||||
],
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project kind - TASK or NOTE"
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": false,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": "{\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"description\": \"Input schema for updating an existing project\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Name of the project\"\n },\n \"color\": {\n \"type\": \"string\",\n \"description\": \"Color of the project - hex color code\"\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"Sort order value - default 0\"\n },\n \"viewMode\": {\n \"type\": \"string\",\n \"enum\": [\n \"list\",\n \"kanban\",\n \"timeline\"\n ],\n \"description\": \"View mode - how the project is displayed\"\n },\n \"kind\": {\n \"type\": \"string\",\n \"enum\": [\n \"TASK\",\n \"NOTE\"\n ],\n \"description\": \"Project kind - TASK or NOTE\"\n }\n }\n },\n \"example\": {\n \"name\": \"Project Name\",\n \"color\": \"#F18181\",\n \"viewMode\": \"list\",\n \"kind\": \"TASK\"\n }\n }\n }\n}",
|
||||
"use_request_body_schema_mode": false,
|
||||
"validate_request_body_schema": false
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,482 @@
|
|||
{
|
||||
"name": "UpdateTaskProperties",
|
||||
"fully_qualified_name": "TicktickApi.UpdateTaskProperties@0.1.0",
|
||||
"description": "Update a task's properties in Ticktick.\n\nUse this tool to update various properties of a task in Ticktick. It requires the task ID and project ID, while other fields are optional. Ideal for modifying task details such as status, title, or due date.",
|
||||
"toolkit": {
|
||||
"name": "ArcadeTicktickApi",
|
||||
"description": null,
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"input": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "task_identifier",
|
||||
"required": true,
|
||||
"description": "The unique ID of the task to update in Ticktick. This is required to identify the specific task to be updated.",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to update"
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "taskId"
|
||||
},
|
||||
{
|
||||
"name": "task_update_properties",
|
||||
"required": true,
|
||||
"description": "JSON object containing all the properties for updating a task. Includes required fields 'id' and 'projectId', and optional fields such as 'title', 'content', 'dueDate', 'priority', etc. Customize the task's details and attributes.",
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": {
|
||||
"id": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task id - must match the task being updated (required)"
|
||||
},
|
||||
"projectId": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project id - must match the project containing the task (required)"
|
||||
},
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task title"
|
||||
},
|
||||
"content": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task content"
|
||||
},
|
||||
"desc": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Description of checklist"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"dueDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the time is specified"
|
||||
},
|
||||
"reminders": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "string",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Lists of reminders specific to the task"
|
||||
},
|
||||
"repeatFlag": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Recurring rules of task"
|
||||
},
|
||||
"priority": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The priority of task (None: 0, Low: 1, Medium: 3, High: 5)"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of task"
|
||||
},
|
||||
"items": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "json",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Subtask title"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of subtask"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the Start time is specified"
|
||||
},
|
||||
"status": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The completion status of subtask - Normal: 0, Completed: 1"
|
||||
},
|
||||
"completedTime": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
}
|
||||
},
|
||||
"description": "The list of subtasks"
|
||||
}
|
||||
},
|
||||
"inner_properties": null,
|
||||
"description": ""
|
||||
},
|
||||
"inferrable": true,
|
||||
"http_endpoint_parameter_name": "requestBody"
|
||||
}
|
||||
]
|
||||
},
|
||||
"output": {
|
||||
"description": "Response from the API endpoint 'updateTask'.",
|
||||
"available_modes": [
|
||||
"value",
|
||||
"error",
|
||||
"null"
|
||||
],
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": null
|
||||
}
|
||||
},
|
||||
"requirements": {
|
||||
"authorization": {
|
||||
"provider_id": "arcade-ticktick",
|
||||
"provider_type": "oauth2",
|
||||
"id": null,
|
||||
"oauth2": {
|
||||
"scopes": [
|
||||
"tasks:write"
|
||||
]
|
||||
}
|
||||
},
|
||||
"secrets": null,
|
||||
"metadata": null
|
||||
},
|
||||
"deprecation_message": null,
|
||||
"metadata": {
|
||||
"object_type": "api_wrapper_tool",
|
||||
"version": "1.1.0",
|
||||
"description": "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
},
|
||||
"http_endpoint": {
|
||||
"metadata": {
|
||||
"object_type": "http_endpoint",
|
||||
"version": "1.2.0",
|
||||
"description": ""
|
||||
},
|
||||
"url": "https://api.ticktick.com/open/v1/task/{taskId}",
|
||||
"http_method": "POST",
|
||||
"headers": {},
|
||||
"parameters": [
|
||||
{
|
||||
"name": "taskId",
|
||||
"tool_parameter_name": "task_identifier",
|
||||
"description": "Task identifier - the unique ID of the task to update",
|
||||
"value_schema": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task identifier - the unique ID of the task to update"
|
||||
},
|
||||
"accepted_as": "path",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
},
|
||||
{
|
||||
"name": "requestBody",
|
||||
"tool_parameter_name": "task_update_properties",
|
||||
"description": "",
|
||||
"value_schema": {
|
||||
"val_type": "json",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": {
|
||||
"id": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task id - must match the task being updated (required)"
|
||||
},
|
||||
"projectId": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Project id - must match the project containing the task (required)"
|
||||
},
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task title"
|
||||
},
|
||||
"content": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Task content"
|
||||
},
|
||||
"desc": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Description of checklist"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"dueDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the time is specified"
|
||||
},
|
||||
"reminders": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "string",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Lists of reminders specific to the task"
|
||||
},
|
||||
"repeatFlag": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Recurring rules of task"
|
||||
},
|
||||
"priority": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The priority of task (None: 0, Low: 1, Medium: 3, High: 5)"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of task"
|
||||
},
|
||||
"items": {
|
||||
"val_type": "array",
|
||||
"inner_val_type": "json",
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": {
|
||||
"title": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Subtask title"
|
||||
},
|
||||
"startDate": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
},
|
||||
"isAllDay": {
|
||||
"val_type": "boolean",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "All day flag"
|
||||
},
|
||||
"sortOrder": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The order of subtask"
|
||||
},
|
||||
"timeZone": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The time zone in which the Start time is specified"
|
||||
},
|
||||
"status": {
|
||||
"val_type": "integer",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "The completion status of subtask - Normal: 0, Completed: 1"
|
||||
},
|
||||
"completedTime": {
|
||||
"val_type": "string",
|
||||
"inner_val_type": null,
|
||||
"enum": null,
|
||||
"properties": null,
|
||||
"inner_properties": null,
|
||||
"description": "Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format"
|
||||
}
|
||||
},
|
||||
"description": "The list of subtasks"
|
||||
}
|
||||
},
|
||||
"inner_properties": null,
|
||||
"description": ""
|
||||
},
|
||||
"accepted_as": "body",
|
||||
"required": true,
|
||||
"deprecated": false,
|
||||
"default": null,
|
||||
"documentation_urls": []
|
||||
}
|
||||
],
|
||||
"documentation_urls": [],
|
||||
"secrets": [
|
||||
{
|
||||
"arcade_key": "auth_token",
|
||||
"parameter_name": "Authorization",
|
||||
"accepted_as": "header",
|
||||
"formatted_value": "Bearer {authorization}",
|
||||
"description": "The OAuth token to use for authentication.",
|
||||
"is_auth_token": true
|
||||
}
|
||||
],
|
||||
"request_body_spec": "{\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"type\": \"object\",\n \"description\": \"Input schema for updating an existing task\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Task id - must match the task being updated (required)\"\n },\n \"projectId\": {\n \"type\": \"string\",\n \"description\": \"Project id - must match the project containing the task (required)\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Task title\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"Task content\"\n },\n \"desc\": {\n \"type\": \"string\",\n \"description\": \"Description of checklist\"\n },\n \"isAllDay\": {\n \"type\": \"boolean\",\n \"description\": \"All day flag\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n },\n \"dueDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Due date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n },\n \"timeZone\": {\n \"type\": \"string\",\n \"description\": \"The time zone in which the time is specified\"\n },\n \"reminders\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"description\": \"Lists of reminders specific to the task\"\n },\n \"repeatFlag\": {\n \"type\": \"string\",\n \"description\": \"Recurring rules of task\"\n },\n \"priority\": {\n \"type\": \"integer\",\n \"description\": \"The priority of task (None: 0, Low: 1, Medium: 3, High: 5)\"\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"The order of task\"\n },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"description\": \"Input schema for creating or updating a checklist item\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Subtask title\"\n },\n \"startDate\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Start date and time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\"\n },\n \"isAllDay\": {\n \"type\": \"boolean\",\n \"description\": \"All day flag\"\n },\n \"sortOrder\": {\n \"type\": \"integer\",\n \"format\": \"int64\",\n \"description\": \"The order of subtask\"\n },\n \"timeZone\": {\n \"type\": \"string\",\n \"description\": \"The time zone in which the Start time is specified\"\n },\n \"status\": {\n \"type\": \"integer\",\n \"format\": \"int32\",\n \"description\": \"The completion status of subtask - Normal: 0, Completed: 1\"\n },\n \"completedTime\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Completed time in 'yyyy-MM-dd'T'HH:mm:ssZ' format\",\n \"example\": \"2019-11-13T03:00:00+0000\"\n }\n }\n },\n \"description\": \"The list of subtasks\"\n }\n },\n \"required\": [\n \"id\",\n \"projectId\"\n ]\n },\n \"example\": {\n \"id\": \"63b7bebb91c0a5474805fcd4\",\n \"projectId\": \"6226ff9877acee87727f6bca\",\n \"title\": \"Updated Task Title\",\n \"priority\": 1\n }\n }\n }\n}",
|
||||
"use_request_body_schema_mode": true,
|
||||
"validate_request_body_schema": true
|
||||
}
|
||||
}
|
||||
60
toolkits/ticktick_api/pyproject.toml
Normal file
60
toolkits/ticktick_api/pyproject.toml
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
[build-system]
|
||||
requires = [ "hatchling",]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[project]
|
||||
name = "arcade_ticktick_api"
|
||||
version = "0.1.0"
|
||||
description = "Tools that enable LLMs to interact directly with the ticktick API."
|
||||
requires-python = ">=3.10"
|
||||
dependencies = [
|
||||
"arcade-tdk>=3.0.0,<4.0.0",
|
||||
"httpx[http2]>=0.27.2,<1.0.0",
|
||||
"jsonschema>=4.0.0,<5.0.0",
|
||||
]
|
||||
[[project.authors]]
|
||||
email = "support@arcade.dev"
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = [
|
||||
"arcade-mcp[all]>=1.2.0,<2.0.0",
|
||||
"arcade-serve>=3.0.0,<4.0.0",
|
||||
"pytest>=8.3.0,<8.4.0",
|
||||
"pytest-cov>=4.0.0,<4.1.0",
|
||||
"pytest-mock>=3.11.1,<3.12.0",
|
||||
"pytest-asyncio>=0.24.0,<0.25.0",
|
||||
"mypy>=1.5.1,<1.6.0",
|
||||
"pre-commit>=3.4.0,<3.5.0",
|
||||
"tox>=4.11.1,<4.12.0",
|
||||
"ruff>=0.7.4,<0.8.0",
|
||||
]
|
||||
|
||||
# Tell Arcade.dev that this package is a toolkit
|
||||
[project.entry-points.arcade_toolkits]
|
||||
toolkit_name = "arcade_ticktick_api"
|
||||
|
||||
# Use local path sources for arcade libs when working locally
|
||||
[tool.uv.sources]
|
||||
arcade-mcp = { path = "../../", editable = true }
|
||||
arcade-serve = { path = "../../libs/arcade-serve/", editable = true }
|
||||
arcade-tdk = { path = "../../libs/arcade-tdk/", editable = true }
|
||||
[tool.mypy]
|
||||
files = [ "arcade_ticktick_api/**/*.py",]
|
||||
python_version = "3.10"
|
||||
disallow_untyped_defs = "True"
|
||||
disallow_any_unimported = "True"
|
||||
no_implicit_optional = "True"
|
||||
check_untyped_defs = "True"
|
||||
warn_return_any = "True"
|
||||
warn_unused_ignores = "True"
|
||||
show_error_codes = "True"
|
||||
ignore_missing_imports = "True"
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
testpaths = [ "tests",]
|
||||
|
||||
[tool.coverage.report]
|
||||
skip_empty = true
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = [ "arcade_ticktick_api",]
|
||||
0
toolkits/ticktick_api/tests/__init__.py
Normal file
0
toolkits/ticktick_api/tests/__init__.py
Normal file
Loading…
Reference in a new issue