🔧 v2.0.6: Fix async/await bug in validate_output_path calls

Remove incorrect 'await' keywords from validate_output_path() calls across all mixins.
validate_output_path() is a synchronous function, not async.

Fixed in 15 locations across 6 mixins:
- advanced_forms.py (4 calls)
- annotations.py (3 calls)
- document_assembly.py (2 calls)
- form_management.py (2 calls)
- image_processing.py (1 call)
- misc_tools.py (4 calls)

Error: 'object PosixPath can't be used in 'await' expression'
Root cause: Incorrectly awaiting synchronous Path validation function
Fix: Removed await keyword from all validate_output_path() calls

PyPI: https://pypi.org/project/mcp-pdf/2.0.6/
This commit is contained in:
Ryan Malloy 2025-11-03 18:03:34 -07:00
parent 3327137536
commit fa65fa6e0c
9 changed files with 20 additions and 20 deletions

View File

@ -1,6 +1,6 @@
[project] [project]
name = "mcp-pdf" name = "mcp-pdf"
version = "2.0.5" version = "2.0.6"
description = "Secure FastMCP server for comprehensive PDF processing - text extraction, OCR, table extraction, forms, annotations, and more" description = "Secure FastMCP server for comprehensive PDF processing - text extraction, OCR, table extraction, forms, annotations, and more"
authors = [{name = "Ryan Malloy", email = "ryan@malloys.us"}] authors = [{name = "Ryan Malloy", email = "ryan@malloys.us"}]
readme = "README.md" readme = "README.md"

View File

@ -57,7 +57,7 @@ class AdvancedFormsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse fields data # Parse fields data
try: try:
@ -174,7 +174,7 @@ class AdvancedFormsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse options # Parse options
try: try:
@ -294,7 +294,7 @@ class AdvancedFormsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Open PDF # Open PDF
doc = fitz.open(str(input_pdf_path)) doc = fitz.open(str(input_pdf_path))
@ -403,7 +403,7 @@ class AdvancedFormsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Open PDF # Open PDF
doc = fitz.open(str(input_pdf_path)) doc = fitz.open(str(input_pdf_path))

View File

@ -57,7 +57,7 @@ class AnnotationsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse notes data # Parse notes data
try: try:
@ -176,7 +176,7 @@ class AnnotationsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse highlights data # Parse highlights data
try: try:
@ -324,7 +324,7 @@ class AnnotationsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse stamps data # Parse stamps data
try: try:

View File

@ -71,7 +71,7 @@ class DocumentAssemblyMixin(MCPMixin):
} }
# Validate output path # Validate output path
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Validate and open all input PDFs # Validate and open all input PDFs
input_docs = [] input_docs = []
@ -324,7 +324,7 @@ class DocumentAssemblyMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(pdf_path) input_pdf_path = await validate_pdf_path(pdf_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse page order # Parse page order
try: try:

View File

@ -163,7 +163,7 @@ class FormManagementMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse form data # Parse form data
try: try:
@ -286,7 +286,7 @@ class FormManagementMixin(MCPMixin):
} }
# Validate output path # Validate output path
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse fields data # Parse fields data
try: try:

View File

@ -75,7 +75,7 @@ class ImageProcessingMixin(MCPMixin):
# Setup output directory # Setup output directory
if output_directory: if output_directory:
output_dir = await validate_output_path(output_directory) output_dir = validate_output_path(output_directory)
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
else: else:
output_dir = Path(tempfile.mkdtemp(prefix="pdf_images_")) output_dir = Path(tempfile.mkdtemp(prefix="pdf_images_"))

View File

@ -367,7 +367,7 @@ class MiscToolsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Parse validation rules # Parse validation rules
try: try:
@ -490,7 +490,7 @@ class MiscToolsMixin(MCPMixin):
} }
# Validate output path # Validate output path
output_pdf_path = await validate_output_path(output_path) output_pdf_path = validate_output_path(output_path)
# Open and analyze input PDFs # Open and analyze input PDFs
input_docs = [] input_docs = []
@ -634,7 +634,7 @@ class MiscToolsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_dir = await validate_output_path(output_directory) output_dir = validate_output_path(output_directory)
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
# Parse page ranges # Parse page ranges
@ -758,7 +758,7 @@ class MiscToolsMixin(MCPMixin):
try: try:
# Validate paths # Validate paths
input_pdf_path = await validate_pdf_path(input_path) input_pdf_path = await validate_pdf_path(input_path)
output_dir = await validate_output_path(output_directory) output_dir = validate_output_path(output_directory)
output_dir.mkdir(parents=True, exist_ok=True) output_dir.mkdir(parents=True, exist_ok=True)
doc = fitz.open(str(input_pdf_path)) doc = fitz.open(str(input_pdf_path))

View File

@ -105,7 +105,7 @@ class PDFServerOfficial:
"""Get detailed server information including mixins and configuration""" """Get detailed server information including mixins and configuration"""
return { return {
"server_name": "MCP PDF Tools (Official FastMCP Pattern)", "server_name": "MCP PDF Tools (Official FastMCP Pattern)",
"version": "2.0.5", "version": "2.0.6",
"architecture": "Official FastMCP Mixin Pattern", "architecture": "Official FastMCP Mixin Pattern",
"total_mixins": len(self.mixins), "total_mixins": len(self.mixins),
"mixins": [ "mixins": [
@ -160,7 +160,7 @@ def main():
from importlib.metadata import version from importlib.metadata import version
package_version = version("mcp-pdf") package_version = version("mcp-pdf")
except: except:
package_version = "2.0.5" package_version = "2.0.6"
logger.info(f"🎬 MCP PDF Tools Server v{package_version} (Official Pattern)") logger.info(f"🎬 MCP PDF Tools Server v{package_version} (Official Pattern)")

2
uv.lock generated
View File

@ -1032,7 +1032,7 @@ wheels = [
[[package]] [[package]]
name = "mcp-pdf" name = "mcp-pdf"
version = "2.0.5" version = "2.0.6"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "camelot-py", extra = ["cv"] }, { name = "camelot-py", extra = ["cv"] },