Refactor docs: slim README, separate API reference
- Condensed README to ~190 lines (was 870+) - Moved full API reference to docs/API_REFERENCE.md - Added tools summary table with link to full docs - Removed redundant nested README 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,547 @@
|
||||
# PaperlessMCP API Reference
|
||||
|
||||
Complete reference for all MCP tools provided by PaperlessMCP.
|
||||
|
||||
## Table of Contents
|
||||
|
||||
- [Health & Capabilities](#health--capabilities)
|
||||
- [Document Operations](#document-operations)
|
||||
- [Tag Operations](#tag-operations)
|
||||
- [Correspondent Operations](#correspondent-operations)
|
||||
- [Document Type Operations](#document-type-operations)
|
||||
- [Storage Path Operations](#storage-path-operations)
|
||||
- [Custom Field Operations](#custom-field-operations)
|
||||
|
||||
---
|
||||
|
||||
## Health & Capabilities
|
||||
|
||||
### `paperless.ping`
|
||||
Verify connectivity and authentication with Paperless-ngx.
|
||||
|
||||
**Returns:** Connection status and server version
|
||||
|
||||
### `paperless.capabilities`
|
||||
Return supported API endpoints and detected Paperless-ngx version information.
|
||||
|
||||
**Returns:** Available endpoints, bulk operations, and server capabilities
|
||||
|
||||
---
|
||||
|
||||
## Document Operations
|
||||
|
||||
### `paperless.documents.search`
|
||||
Search for documents with full-text search and filters.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `query` | string | No | - | Full-text search query |
|
||||
| `tags` | string | No | - | Filter by tag IDs (comma-separated) |
|
||||
| `tagsExclude` | string | No | - | Exclude tag IDs (comma-separated) |
|
||||
| `correspondent` | int | No | - | Filter by correspondent ID |
|
||||
| `documentType` | int | No | - | Filter by document type ID |
|
||||
| `storagePath` | int | No | - | Filter by storage path ID |
|
||||
| `createdAfter` | string | No | - | Filter by creation date (YYYY-MM-DD) |
|
||||
| `createdBefore` | string | No | - | Filter by creation date (YYYY-MM-DD) |
|
||||
| `addedAfter` | string | No | - | Filter by added date (YYYY-MM-DD) |
|
||||
| `addedBefore` | string | No | - | Filter by added date (YYYY-MM-DD) |
|
||||
| `archiveSerialNumber` | int | No | - | Filter by archive serial number |
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
| `ordering` | string | No | - | Sort field (e.g., 'created', '-created', 'title') |
|
||||
| `includeContent` | bool | No | false | Include document content in results |
|
||||
| `contentMaxLength` | int | No | 500 | Max content length when `includeContent=true` |
|
||||
|
||||
**Returns:** Paginated list of document summaries
|
||||
|
||||
### `paperless.documents.get`
|
||||
Get a document by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document ID |
|
||||
|
||||
**Returns:** Complete document details including content
|
||||
|
||||
### `paperless.documents.download`
|
||||
Get download URLs for a document's original file, preview, and thumbnail.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document ID |
|
||||
|
||||
**Returns:** Object with `original_url`, `preview_url`, `thumbnail_url`
|
||||
|
||||
### `paperless.documents.preview`
|
||||
Get the preview URL for a document.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document ID |
|
||||
|
||||
**Returns:** Preview URL
|
||||
|
||||
### `paperless.documents.thumbnail`
|
||||
Get the thumbnail URL for a document.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document ID |
|
||||
|
||||
**Returns:** Thumbnail URL
|
||||
|
||||
### `paperless.documents.upload`
|
||||
Upload a new document to Paperless-ngx via base64-encoded content.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `fileContent` | string | Yes | - | Base64-encoded file content |
|
||||
| `fileName` | string | Yes | - | Original filename with extension |
|
||||
| `title` | string | No | - | Document title |
|
||||
| `correspondent` | int | No | - | Correspondent ID |
|
||||
| `documentType` | int | No | - | Document type ID |
|
||||
| `storagePath` | int | No | - | Storage path ID |
|
||||
| `tags` | string | No | - | Tag IDs (comma-separated) |
|
||||
| `archiveSerialNumber` | int | No | - | Archive serial number |
|
||||
| `created` | string | No | - | Created date (YYYY-MM-DD) |
|
||||
|
||||
**Returns:** Task ID and upload status
|
||||
|
||||
> **Note:** For large files, use `paperless.documents.upload_from_path` instead.
|
||||
|
||||
### `paperless.documents.upload_from_path`
|
||||
Upload a document from a local file path. More reliable for large files.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `filePath` | string | Yes | - | Absolute path to the file |
|
||||
| `title` | string | No | filename | Document title |
|
||||
| `correspondent` | int | No | - | Correspondent ID |
|
||||
| `documentType` | int | No | - | Document type ID |
|
||||
| `storagePath` | int | No | - | Storage path ID |
|
||||
| `tags` | string | No | - | Tag IDs (comma-separated) |
|
||||
| `archiveSerialNumber` | int | No | - | Archive serial number |
|
||||
| `created` | string | No | - | Created date (YYYY-MM-DD) |
|
||||
|
||||
**Returns:** Task ID, upload status, and file information
|
||||
|
||||
**Features:** Supports `~/` expansion, automatic retries, file validation
|
||||
|
||||
### `paperless.documents.update`
|
||||
Update document metadata.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Document ID |
|
||||
| `title` | string | No | - | New title |
|
||||
| `correspondent` | int | No | - | Correspondent ID (use -1 to clear) |
|
||||
| `documentType` | int | No | - | Document type ID (use -1 to clear) |
|
||||
| `storagePath` | int | No | - | Storage path ID (use -1 to clear) |
|
||||
| `tags` | string | No | - | Tag IDs to set (comma-separated) |
|
||||
| `archiveSerialNumber` | int | No | - | Archive serial number |
|
||||
| `created` | string | No | - | Created date (YYYY-MM-DD) |
|
||||
|
||||
**Returns:** Updated document
|
||||
|
||||
### `paperless.documents.delete`
|
||||
Delete a document. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Document ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
> **Safety:** Without `confirm=true`, returns a dry-run preview showing what would be deleted.
|
||||
|
||||
### `paperless.documents.bulk_update`
|
||||
Perform bulk operations on multiple documents.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `documentIds` | string | Yes | - | Document IDs (comma-separated) |
|
||||
| `operation` | string | Yes | - | Operation: `add_tag`, `remove_tag`, `set_correspondent`, `set_document_type`, `set_storage_path`, `delete`, `reprocess` |
|
||||
| `value` | int | No | - | Parameter value (e.g., tag ID, correspondent ID) |
|
||||
| `dryRun` | bool | No | true | Preview changes without applying |
|
||||
| `confirm` | bool | No | false | Must be true to execute |
|
||||
|
||||
**Returns:** Affected document IDs and operation status
|
||||
|
||||
> **Safety:** Defaults to dry-run mode to prevent accidental changes.
|
||||
|
||||
### `paperless.documents.reprocess`
|
||||
Reprocess a document's OCR and content extraction.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Document ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm reprocessing |
|
||||
|
||||
**Returns:** Processing status
|
||||
|
||||
---
|
||||
|
||||
## Tag Operations
|
||||
|
||||
### `paperless.tags.list`
|
||||
List all tags with pagination.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
| `ordering` | string | No | - | Sort field (e.g., 'name', '-document_count') |
|
||||
|
||||
**Returns:** Paginated list of tags
|
||||
|
||||
### `paperless.tags.get`
|
||||
Get a tag by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Tag ID |
|
||||
|
||||
**Returns:** Tag details
|
||||
|
||||
### `paperless.tags.create`
|
||||
Create a new tag.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `name` | string | Yes | - | Tag name |
|
||||
| `color` | string | No | - | Hex color (e.g., '#ff0000') |
|
||||
| `match` | string | No | - | Match pattern for auto-tagging |
|
||||
| `matchingAlgorithm` | int | No | 0 | Matching algorithm (see below) |
|
||||
| `isInboxTag` | bool | No | false | Mark as inbox tag |
|
||||
|
||||
**Matching Algorithms:**
|
||||
- `0` - None
|
||||
- `1` - Any word
|
||||
- `2` - All words
|
||||
- `3` - Literal match
|
||||
- `4` - Regular expression
|
||||
- `5` - Fuzzy match
|
||||
- `6` - Auto
|
||||
|
||||
**Returns:** Created tag
|
||||
|
||||
### `paperless.tags.update`
|
||||
Update an existing tag.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Tag ID |
|
||||
| `name` | string | No | New name |
|
||||
| `color` | string | No | Hex color |
|
||||
| `match` | string | No | Match pattern |
|
||||
| `matchingAlgorithm` | int | No | Matching algorithm |
|
||||
| `isInboxTag` | bool | No | Inbox tag status |
|
||||
|
||||
**Returns:** Updated tag
|
||||
|
||||
### `paperless.tags.delete`
|
||||
Delete a tag. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Tag ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
### `paperless.tags.bulk_delete`
|
||||
Delete multiple tags.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `tagIds` | string | Yes | - | Tag IDs (comma-separated) |
|
||||
| `dryRun` | bool | No | true | Preview changes without applying |
|
||||
| `confirm` | bool | No | false | Must be true to execute |
|
||||
|
||||
**Returns:** Affected tag IDs and operation status
|
||||
|
||||
---
|
||||
|
||||
## Correspondent Operations
|
||||
|
||||
### `paperless.correspondents.list`
|
||||
List all correspondents with pagination.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
| `ordering` | string | No | - | Sort field (e.g., 'name', '-document_count', 'last_correspondence') |
|
||||
|
||||
**Returns:** Paginated list of correspondents
|
||||
|
||||
### `paperless.correspondents.get`
|
||||
Get a correspondent by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Correspondent ID |
|
||||
|
||||
**Returns:** Correspondent details
|
||||
|
||||
### `paperless.correspondents.create`
|
||||
Create a new correspondent.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `name` | string | Yes | - | Correspondent name |
|
||||
| `match` | string | No | - | Match pattern for auto-assignment |
|
||||
| `matchingAlgorithm` | int | No | 0 | Matching algorithm |
|
||||
|
||||
**Returns:** Created correspondent
|
||||
|
||||
### `paperless.correspondents.update`
|
||||
Update an existing correspondent.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Correspondent ID |
|
||||
| `name` | string | No | New name |
|
||||
| `match` | string | No | Match pattern |
|
||||
| `matchingAlgorithm` | int | No | Matching algorithm |
|
||||
|
||||
**Returns:** Updated correspondent
|
||||
|
||||
### `paperless.correspondents.delete`
|
||||
Delete a correspondent. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Correspondent ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
### `paperless.correspondents.bulk_delete`
|
||||
Delete multiple correspondents.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `correspondentIds` | string | Yes | - | Correspondent IDs (comma-separated) |
|
||||
| `dryRun` | bool | No | true | Preview changes without applying |
|
||||
| `confirm` | bool | No | false | Must be true to execute |
|
||||
|
||||
**Returns:** Affected correspondent IDs and operation status
|
||||
|
||||
---
|
||||
|
||||
## Document Type Operations
|
||||
|
||||
### `paperless.document_types.list`
|
||||
List all document types with pagination.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
| `ordering` | string | No | - | Sort field (e.g., 'name', '-document_count') |
|
||||
|
||||
**Returns:** Paginated list of document types
|
||||
|
||||
### `paperless.document_types.get`
|
||||
Get a document type by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document type ID |
|
||||
|
||||
**Returns:** Document type details
|
||||
|
||||
### `paperless.document_types.create`
|
||||
Create a new document type.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `name` | string | Yes | - | Document type name |
|
||||
| `match` | string | No | - | Match pattern for auto-assignment |
|
||||
| `matchingAlgorithm` | int | No | 0 | Matching algorithm |
|
||||
|
||||
**Returns:** Created document type
|
||||
|
||||
### `paperless.document_types.update`
|
||||
Update an existing document type.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Document type ID |
|
||||
| `name` | string | No | New name |
|
||||
| `match` | string | No | Match pattern |
|
||||
| `matchingAlgorithm` | int | No | Matching algorithm |
|
||||
|
||||
**Returns:** Updated document type
|
||||
|
||||
### `paperless.document_types.delete`
|
||||
Delete a document type. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Document type ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
### `paperless.document_types.bulk_delete`
|
||||
Delete multiple document types.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `documentTypeIds` | string | Yes | - | Document type IDs (comma-separated) |
|
||||
| `dryRun` | bool | No | true | Preview changes without applying |
|
||||
| `confirm` | bool | No | false | Must be true to execute |
|
||||
|
||||
**Returns:** Affected document type IDs and operation status
|
||||
|
||||
---
|
||||
|
||||
## Storage Path Operations
|
||||
|
||||
### `paperless.storage_paths.list`
|
||||
List all storage paths with pagination.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
| `ordering` | string | No | - | Sort field (e.g., 'name', '-document_count') |
|
||||
|
||||
**Returns:** Paginated list of storage paths
|
||||
|
||||
### `paperless.storage_paths.get`
|
||||
Get a storage path by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Storage path ID |
|
||||
|
||||
**Returns:** Storage path details
|
||||
|
||||
### `paperless.storage_paths.create`
|
||||
Create a new storage path.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `name` | string | Yes | - | Storage path name |
|
||||
| `path` | string | Yes | - | Path template (e.g., `{correspondent}/{document_type}`) |
|
||||
| `match` | string | No | - | Match pattern for auto-assignment |
|
||||
| `matchingAlgorithm` | int | No | 0 | Matching algorithm |
|
||||
|
||||
**Returns:** Created storage path
|
||||
|
||||
### `paperless.storage_paths.update`
|
||||
Update an existing storage path.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Storage path ID |
|
||||
| `name` | string | No | New name |
|
||||
| `path` | string | No | Path template |
|
||||
| `match` | string | No | Match pattern |
|
||||
| `matchingAlgorithm` | int | No | Matching algorithm |
|
||||
|
||||
**Returns:** Updated storage path
|
||||
|
||||
### `paperless.storage_paths.delete`
|
||||
Delete a storage path. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Storage path ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
### `paperless.storage_paths.bulk_delete`
|
||||
Delete multiple storage paths.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `storagePathIds` | string | Yes | - | Storage path IDs (comma-separated) |
|
||||
| `dryRun` | bool | No | true | Preview changes without applying |
|
||||
| `confirm` | bool | No | false | Must be true to execute |
|
||||
|
||||
**Returns:** Affected storage path IDs and operation status
|
||||
|
||||
---
|
||||
|
||||
## Custom Field Operations
|
||||
|
||||
### `paperless.custom_fields.list`
|
||||
List all custom field definitions with pagination.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `page` | int | No | 1 | Page number |
|
||||
| `pageSize` | int | No | 25 | Results per page (max: 100) |
|
||||
|
||||
**Returns:** Paginated list of custom field definitions
|
||||
|
||||
### `paperless.custom_fields.get`
|
||||
Get a custom field definition by its ID.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Custom field ID |
|
||||
|
||||
**Returns:** Custom field details
|
||||
|
||||
### `paperless.custom_fields.create`
|
||||
Create a new custom field definition.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `name` | string | Yes | - | Custom field name |
|
||||
| `dataType` | string | Yes | - | Data type (see below) |
|
||||
| `selectOptions` | string | No | - | Select options (comma-separated, for 'select' type) |
|
||||
| `defaultCurrency` | string | No | - | Default currency (for 'monetary' type) |
|
||||
|
||||
**Data Types:**
|
||||
- `string` - Text value
|
||||
- `url` - URL/link
|
||||
- `date` - Date value
|
||||
- `boolean` - True/false
|
||||
- `integer` - Whole number
|
||||
- `float` - Decimal number
|
||||
- `monetary` - Currency amount
|
||||
- `documentlink` - Link to another document
|
||||
- `select` - Dropdown selection
|
||||
|
||||
**Returns:** Created custom field
|
||||
|
||||
### `paperless.custom_fields.update`
|
||||
Update an existing custom field definition.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `id` | int | Yes | Custom field ID |
|
||||
| `name` | string | No | New name |
|
||||
| `selectOptions` | string | No | Select options (comma-separated) |
|
||||
| `defaultCurrency` | string | No | Default currency |
|
||||
|
||||
**Returns:** Updated custom field
|
||||
|
||||
### `paperless.custom_fields.delete`
|
||||
Delete a custom field definition. Requires explicit confirmation.
|
||||
|
||||
| Parameter | Type | Required | Default | Description |
|
||||
|-----------|------|----------|---------|-------------|
|
||||
| `id` | int | Yes | - | Custom field ID |
|
||||
| `confirm` | bool | No | false | Must be true to confirm deletion |
|
||||
|
||||
**Returns:** Deletion status or dry-run preview
|
||||
|
||||
### `paperless.custom_fields.assign`
|
||||
Assign a custom field value to a document.
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------|
|
||||
| `documentId` | int | Yes | Document ID |
|
||||
| `fieldId` | int | Yes | Custom field ID |
|
||||
| `value` | string | Yes | Value to assign (type depends on field) |
|
||||
|
||||
**Returns:** Assignment status and assigned value
|
||||
Reference in New Issue
Block a user